美文网首页Python GUIPython Qt GUI设计
Python Qt GUI设计:多线程中信号与槽的使用(基础篇—

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

作者: 不脱发的程序猿 | 来源:发表于2021-11-17 18:56 被阅读0次

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

    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,  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_())

    运行效果如下所示:

    相关文章

      网友评论

        本文标题:Python Qt GUI设计:多线程中信号与槽的使用(基础篇—

        本文链接:https://www.haomeiwen.com/subject/xofrtrtx.html