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

PyQt5.QtCore.QThread__init__()构造函数的源码解析

发布时间:2023-12-15 23:14:40

PyQt5是一个用于Python的GUI编程工具包,其中QtCore模块中的QThread类提供了一个用于多线程编程的工具。QThread类的init方法是它的构造函数,用于初始化一个QThread对象。

QThread类的构造函数如下所示:

def __init__(self, parent=None)

构造函数接受一个可选的父级对象作为参数。如果指定了父级对象,那么当父级对象被销毁时,QThread对象也会被销毁。

下面是一个使用QThread类的简单示例:

import sys
from PyQt5.QtCore import QThread, Qt, pyqtSignal
from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QProgressBar, QPushButton

class WorkerThread(QThread):
    # 自定义信号,用于在子线程中更新UI
    progressChanged = pyqtSignal(int)

    def run(self):
        # 子线程的任务
        for i in range(101):
            self.progressChanged.emit(i)
            self.sleep(0.1)

class MainWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()

        self.progressBar = QProgressBar()
        layout.addWidget(self.progressBar)

        self.button = QPushButton("Start")
        self.button.clicked.connect(self.startThread)
        layout.addWidget(self.button)

        self.setLayout(layout)
        self.setWindowTitle("QThread Example")

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

        self.thread = WorkerThread()
        self.thread.progressChanged.connect(self.updateProgressBar)
        self.thread.finished.connect(self.threadFinished)
        self.thread.start()

    def updateProgressBar(self, value):
        self.progressBar.setValue(value)

    def threadFinished(self):
        self.button.setEnabled(True)

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

在这个例子中,我们自定义了一个WorkerThread类,继承自QThread类。这个类中使用了一个自定义的信号progressChanged,用于在子线程中更新UI。在run方法中,我们通过emit方法发射progressChanged信号来更新进度条的值。然后我们在MainWindow类中通过connect方法连接progressChanged信号和updateProgressBar方法,以及finished信号和threadFinished方法,来更新进度条的值和恢复按钮的状态。

在主线程中,我们通过点击按钮来启动子线程。点击按钮后,按钮会被禁用,子线程会开始执行run方法中的任务,并发射progressChanged信号来更新进度条的值。当子线程任务结束后,会发射finished信号,我们在threadFinished方法中恢复按钮的状态。

这就是QThread类构造函数的源码解析和使用例子。通过使用QThread类,我们可以方便地在PyQt5中进行多线程编程,并在子线程中更新UI。