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では、サブウィンドウのインスタンスを作成し、主ウィンドウを表示しています。
サブウィンドウのボタンクリックにより子スレッドが起動し、処理を完了後も引き続き処理を行います。