写点什么

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

  • 2021 年 11 月 17 日
  • 本文字数:1435 字

    阅读完需:约 5 分钟

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 类中的常用方法如下表所示:

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

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,  QLineEditimport timeimport 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_())
复制代码

运行效果如下所示:



参考资料、拓展学习:

多线程(Qtimer和Qthread),网页交互(QWebEngineView,js与python的交互)

PyQt5高级界面控件之QThread(十二)

发布于: 1 小时前阅读数: 4
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程,关注获取海量资源~

评论

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