欢迎访问宙启技术站
智能推送

PyQt5.QtCore.QThread:使用信号与槽实现线程通信

发布时间:2024-01-04 14:54:00

在PyQt5中,可以使用QThread类来创建线程,并且可以使用信号与槽机制来实现线程之间的通信。QThread类位于PyQt5.QtCore模块中,可以使用该类的方法和属性来创建和控制线程。

使用信号与槽机制可以实现线程之间的通信。线程可以发送信号,其他线程可以通过连接到该信号的槽函数来接收并处理该信号。这样可以在不同线程中进行数据传输和交互。

下面是一个使用信号与槽实现线程通信的示例:

import sys
import time
from PyQt5.QtCore import Qt, QThread, pyqtSignal


class WorkerThread(QThread):
    # 定义一个信号
    finished = pyqtSignal()

    def run(self):
        # 模拟耗时操作
        for i in range(10):
            print("Working: ", i)
            time.sleep(1)
        # 发送信号
        self.finished.emit()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setWindowTitle('Thread Example')
        self.setGeometry(300, 300, 300, 200)

        self.button = QPushButton('Start', self)
        self.button.clicked.connect(self.startThread)

    def startThread(self):
        self.button.setEnabled(False)

        self.thread = WorkerThread()
        # 连接信号和槽函数
        self.thread.finished.connect(self.threadFinished)

        self.thread.start()

    def threadFinished(self):
        print("Thread finished.")
        self.button.setEnabled(True)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

在上面的示例中,使用QThread类创建了一个后台线程WorkerThread。WorkerThread类中定义了一个信号finished,在run()方法中进行耗时操作,最后发送该信号。在MainWindow类中,通过连接该信号的槽函数threadFinished来接收并处理该信号。主窗口中的按钮通过连接到startThread槽函数来启动线程。

当点击按钮时,按钮将被禁用,线程开始执行耗时操作。当线程完成后,发送finished信号,并最终调用threadFinished槽函数,该函数将显示一条消息,并启用按钮。

这是一个简单的示例,演示了如何使用信号与槽机制实现线程之间的通信。实际应用中,可以根据需要在信号和槽函数中传递参数,以满足特定需求。