Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)

简介: Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)

有时候在项目开发时,经常会遇到一些耗时操作导致界面迟缓卡顿,为了解决这个问题,可以创建多线程,使用主线程更新界面使用子线程实时处理数据,最后将结果显示到界面上。


PyQt多线程将使用QThread函数,QThread是Qt的线程类中最核心的底层类。由于PyQt的的跨平台特性,QThread要隐藏所有与平台相关的代码要使用的QThread开始一个线程,可以创建它的一个子类,然后覆盖其它QThread.run()函数。


PyQt的线程使用非常简单:建立一个自定义的类(如thread),自我继承自QThread ,并实现其run()方法即可。


在使用线程时可以直接得到Thread实例,调用其start()函数即可启动线程,线程启动之后,会自动调用其实现的run()函数,该方法就是线程的执行函数业务的线程任务就写在run()函数中,当run()退出之后线程就基本结束了。


QThread有started和finished信号,可以为这两个信号指定槽函数,在线程启动和结束之时执行一段代码进行资源的初始化和释放操作,更灵活的使用方法是:在自定义的QThread实例中自定义信号,并将信号连接到指定的槽函数,当满足一定的业务条件时发射此信号。


QThread类中的常用方法如下表所示:


方法 描述

start() 启动线程

wait()

阻止线程,直到满足如下条件之一。


1、与此QThread对象关联的线程已完成执行(即从run返回时),如果线程完成执行,此函数返回True,如果线程尚未启动,也返回True;


2、等待时间的单位是毫秒,如果时间是ULONG_MAX(默认值·),则等待,永远不会超时(线程必须从run返回),如果等待超时,此函数将会返回False


sleep() 强制当前线程睡眠多少秒

QThread类中的常用信号如下表所示:


信号 描述

started 在开始执行run函数之前,从相关线程发射此信号

finished 当程序完成业务逻辑时,从相关线程发射此信号

QThread的简单使用如以下代码所示:

class Thread(QThread):     #继承QThread
      def __init__(self):
          super(Thread,self).__init__()
      def run(self):
          #线程相关的代码
          passs
#创建一个新的线程
thread=Thread()
#启动线程
thread.start()

通过一个小案例来了解QThread多线程的使用吧。本例中,定义了一个后台线程类BackendThread来模拟后台耗时操作,在这个线程类中定义了信号update_date。使用 BackendThread 线程类在后台处理数据,每秒发射一次自定义信号update_date。


在初始化窗口界面时,定义后台线程类BackendThread,并把线程类的信号update_date连接到槽函数handleDisplay()。这样后台线程每发射一次信号,就可以把最新的时间值实时显示在前台窗口的QLineEdit文本对话框中。


实现代码如下所示:


from PyQt5.QtCore import QThread ,  pyqtSignal,  QDateTime 
from PyQt5.QtWidgets import QApplication,  QDialog,  QLineEdit
import time
import sys
class BackendThread(QThread):
    # 通过类成员对象定义信号对象  
  update_date = pyqtSignal(str)
    # 处理要做的业务逻辑
  def run(self):
  while True:
    data = QDateTime.currentDateTime()
    currTime = data.toString("yyyy-MM-dd hh:mm:ss")
    self.update_date.emit( str(currTime) )
    time.sleep(1)
class Window(QDialog):
  def __init__(self):
  QDialog.__init__(self)
  self.setWindowTitle('PyQt5界面实时更新例子')
  self.resize(400, 100)
  self.input = QLineEdit(self)
  self.input.resize(400, 100)
  self.initUI()
  def initUI(self):
        # 创建线程  
  self.backend = BackendThread()
        # 连接信号 
  self.backend.update_date.connect(self.handleDisplay)
        # 开始线程  
  self.backend.start()
    #将当前时间输出到文本框
  def handleDisplay(self, data):
  self.input.setText(data)
if __name__ == '__main__':
  app = QApplication(sys.argv)
  win = Window()
  win.show() 
  sys.exit(app.exec_())

运行效果如下所示:


image.png

相关文章
|
14天前
|
安全
python_threading多线程、queue安全队列
python_threading多线程、queue安全队列
19 2
|
1天前
|
消息中间件 程序员 调度
Python并发编程:利用多线程提升程序性能
本文探讨了Python中的并发编程技术,重点介绍了如何利用多线程提升程序性能。通过分析多线程的原理和实现方式,以及线程间的通信和同步方法,读者可以了解如何在Python中编写高效的并发程序,提升程序的执行效率和响应速度。
|
10天前
|
并行计算 安全 测试技术
Python多线程
【4月更文挑战第13天】对比多线程与多进程:多线程适合I/O密集型任务,轻量级但受GIL限制;多进程适用于CPU密集型任务,能实现真正并行。多线程直接共享内存,多进程独立内存,各有优劣。
9 0
|
10天前
|
数据采集 安全 Java
Python的多线程,守护线程,线程安全
Python的多线程,守护线程,线程安全
|
10天前
|
并行计算 数据处理 开发者
Python并发编程:解析异步IO与多线程
本文探讨了Python中的并发编程技术,着重比较了异步IO和多线程两种常见的并发模型。通过详细分析它们的特点、优劣势以及适用场景,帮助读者更好地理解并选择适合自己项目需求的并发编程方式。
|
11天前
|
调度 Python 容器
【python】-详解进程与线程
【python】-详解进程与线程
|
13天前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
128 5
|
15天前
|
运维 监控 Unix
第十五章 Python多进程与多线程
第十五章 Python多进程与多线程
|
2月前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
23 0
|
2月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
44 8
C++ Qt开发:QTcpSocket网络通信组件

推荐镜像

更多