在Python中,QThread
是Qt框架中的一個類,用于在單獨的線程中執行耗時操作,以避免阻塞主線程。要在Qt中使用QThread
,你需要先創建一個QThread
對象,然后將需要在線程中運行的QObject
(通常是自定義的QWidget子類)移動到該線程中。
以下是一個簡單的示例,展示了如何在PyQt5中使用QThread
:
pip install PyQt5
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel
from PyQt5.QtCore import QThread, pyqtSignal
class Worker(QObject):
# 定義一個信號,用于將結果從工作線程傳遞回主線程
result_ready = pyqtSignal(str)
def __init__(self):
super().__init__()
def do_work(self):
# 在這里執行耗時操作
import time
time.sleep(5)
result = "工作完成!"
self.result_ready.emit(result)
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('QThread示例')
layout = QVBoxLayout()
self.button = QPushButton('點擊啟動工作線程', self)
self.button.clicked.connect(self.start_work)
layout.addWidget(self.button)
self.label = QLabel('等待工作完成...', self)
layout.addWidget(self.label)
self.setLayout(layout)
def start_work(self):
# 創建一個QThread對象
self.thread = QThread()
# 創建一個Worker對象并將其移動到新線程中
self.worker = Worker()
self.worker.moveToThread(self.thread)
# 連接信號和槽,以便在工作完成時將結果傳遞回主線程
self.worker.result_ready.connect(self.on_work_done)
# 開始新線程
self.thread.start()
def on_work_done(self, result):
# 在主線程中更新UI
self.label.setText(result)
# 停止工作線程
self.thread.quit()
self.thread.wait()
if __name__ == '__main__':
app = QApplication(sys.argv)
my_app = MyApp()
my_app.show()
sys.exit(app.exec_())
在這個示例中,我們創建了一個名為Worker
的類,它包含一個信號result_ready
,用于將結果從工作線程傳遞回主線程。我們還創建了一個名為MyApp
的類,它繼承自QWidget
,并包含一個按鈕和一個標簽。當用戶點擊按鈕時,將創建一個新的QThread
對象,并將Worker
對象移動到新線程中。然后,我們連接Worker
對象的result_ready
信號和MyApp
類的on_work_done
槽,以便在工作完成時將結果傳遞回主線程并更新UI。