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的简单使用如以下代码所示:

```python class Thread(QThread): #继承QThread def init(self): super(Thread,self).init()

def run(self):
      #线程相关的代码
      passs

创建一个新的线程

thread=Thread()

启动线程

thread.start() ```

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

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

实现代码如下所示:

```python 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_()) ```

运行效果如下所示:


参考资料、拓展学习:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44079197

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值