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

使用PyQt5.QtCore.QThread实现线程间通信

发布时间:2024-01-04 14:51:55

在 PyQt5 中,可以使用 QThread 实现多线程编程,并且可以通过信号和槽机制实现线程间的通信。下面是一个关于如何使用 QThread 实现线程间通信的例子。

首先,我们创建一个继承自 QThread 的子类,并在该子类中实现我们想要在线程中执行的操作。具体的执行操作可以在 run() 方法中实现。

from PyQt5.QtCore import QThread, pyqtSignal

class WorkerThread(QThread):
    
    # 通过信号实现线程间的通信,定义带有一个整数参数的信号
    progress = pyqtSignal(int)
    
    def run(self):
        for i in range(1, 101):
            # 发送信号,通知主线程进行更新
            self.progress.emit(i)
            self.sleep(1)

在这个例子中,我们重写了 run() 方法,循环从1到100并发送一个代表进度的整数信号。我们通过 pyqtSignal 定义了一个 progress 信号。

接下来,我们创建一个 QMainWindow 子类作为主窗口,并实现了一个用于更新界面的槽方法。

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        # 创建一个布局
        layout = QVBoxLayout()
        
        # 创建一个进度条,用于显示进度
        self.progress_bar = QProgressBar()
        layout.addWidget(self.progress_bar)
        
        # 创建一个按钮,用于开启线程
        self.button = QPushButton('Start')
        layout.addWidget(self.button)
        
        # 创建一个窗口部件,并设置布局为上面创建的布局
        widget = QWidget()
        widget.setLayout(layout)
        
        # 将这个窗口部件设置为主窗口的中心部件
        self.setCentralWidget(widget)
        
        # 连接按钮的点击事件到槽方法
        self.button.clicked.connect(self.start_worker_thread)
        
    def start_worker_thread(self):
        # 创建线程实例并启动
        self.worker_thread = WorkerThread()
        self.worker_thread.progress.connect(self.update_progress)
        self.worker_thread.start()
        
    def update_progress(self, value):
        # 更新进度条的值
        self.progress_bar.setValue(value)

在这个例子中,我们的主窗口继承自 QMainWindow,并重写了 __init__ 方法以及一个用于启动线程的槽方法 start_worker_thread 和一个用于更新界面的槽方法 update_progress。在 start_worker_thread 方法中,我们创建了一个 WorkerThread 的实例,并将它的 progress 信号连接到 update_progress 槽方法。然后,我们通过调用 start() 方法启动线程。

最后,我们创建一个 QApplication 实例并显示主窗口。

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

在这个例子中,当我们点击按钮时,将会创建一个线程并启动它,线程中会每秒发送一个代表进度的整数信号,主界面通过连接这个信号到一个更新进度条的槽方法来实现界面的更新。

这就是使用 QThread 实现线程间通信的一个例子。通过这种方式,我们可以在 PyQt5 中实现多线程编程,并通过信号和槽机制实现线程间的通信。