PyQtで子ウィンドウにスレッドを作成する

PyQt でサブウィンドウを作成するスレッドでは、QThread クラスを使用できます。以下に簡単な例を示します。

from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget


class WorkerThread(QThread):
    finished = pyqtSignal()

    def run(self):
        # 在这里执行需要在子线程中运行的任务
        # ...

        self.finished.emit()


class SubWindow(QWidget):
    def __init__(self, parent=None):
        super(SubWindow, self).__init__(parent)
        self.button = QPushButton("Start", self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.button.clicked.connect(self.start_worker_thread)

    def start_worker_thread(self):
        self.worker_thread = WorkerThread()
        self.worker_thread.finished.connect(self.worker_thread_finished)
        self.worker_thread.start()

    def worker_thread_finished(self):
        # 在这里处理子线程结束后的操作
        # ...


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.sub_window = SubWindow(self)
        self.setCentralWidget(self.sub_window)


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

この例では、QThread から継承した WorkerThread クラスを作成しています。WorkerThread クラスの run() メソッドの中で、サブスレッドで実行する必要があるタスクを実行し、完了のシグナルとして finished シグナルを発信できます。

Start_worker_thread()メソッドでは、WorkerThreadのインスタンスを作成し、finishedシグナルにworker_thread_finished()メソッドを接続し、start()メソッドを呼び出してワーカースレッドを開始します。

worker_thread_finished()メソッドで、子スレッド終了後の処理が行えます。

MainWindowクラスを作成し、中央ウィンドウにサブウィンドウを置きました。MainWindowでは、サブウィンドウのインスタンスを作成し、主ウィンドウを表示しています。

サブウィンドウのボタンクリックにより子スレッドが起動し、処理を完了後も引き続き処理を行います。

bannerAds