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

Pyqt5中QThread的多线程编程实例

发布时间:2023-12-26 19:40:58

在PyQt5中,可以使用QThread类实现多线程编程。QThread是一个用于管理线程的类,它提供了一些方法和信号,可以方便地创建和管理多线程。

下面是一个使用QThread类的多线程编程实例:

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import time


class Worker(QThread):
    finished = pyqtSignal()  # 自定义信号,用于在线程完成时发出信号

    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(5):
            time.sleep(1)  # 模拟耗时操作
            print("子线程:", i)
        self.finished.emit()  # 发出信号,表示线程已完成


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("多线程示例")
        self.setGeometry(100, 100, 300, 200)

        self.button = QPushButton("启动线程", self)
        self.button.clicked.connect(self.start_thread)
        self.button.setGeometry(100, 100, 100, 30)

        self.label = QLabel("等待线程完成...", self)
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setGeometry(50, 50, 200, 30)

        self.worker = Worker()
        self.worker.finished.connect(self.thread_finished)

    def start_thread(self):
        self.button.setEnabled(False)
        self.label.setText("线程运行中...")
        self.worker.start()  # 启动线程

    def thread_finished(self):
        self.button.setEnabled(True)
        self.label.setText("线程已完成")


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

在上面的例子中,我们创建了一个Worker类,继承自QThread。在Worker类中,我们重写了run()方法,该方法中模拟了一个耗时的操作,并使用了time.sleep()来模拟延时。然后,在run()方法中,我们通过self.finished.emit()发送了一个自定义信号,表示线程已完成。

在MainWindow类中,我们创建了一个按钮和一个文本标签。当点击按钮时,我们禁用按钮,并将标签的文本设置为"线程运行中..."。然后,我们调用self.worker.start()启动线程。

在thread_finished()方法中,我们接收到worker的finished信号后,我们将按钮重新启用,并将标签的文本设置为"线程已完成"。

通过运行上述代码,你可以看到按钮被禁用,而标签显示"线程运行中..."。当线程完成后,按钮重新启用,并且标签显示"线程已完成"。

这就是使用QThread类实现多线程编程的一个简单示例。在实际应用中,你可以在Worker类中执行更复杂的操作,例如下载文件、处理大数据等。