QThread
是 PyQt(Python bindings for Qt)中的一個類,用于在多線程環境中執行代碼。它基于 Qt 的線程機制,提供了一種簡單的方法來將耗時任務與主線程分離,從而避免阻塞主線程,提高應用程序的響應性。
QThread
的主要原理如下:
線程與事件循環:QThread
內部維護了一個事件循環(event loop),用于處理線程間通信和事件。當你在 QThread
中運行一個長時間運行的任務時,這個任務會在單獨的線程中執行,而不會阻塞主線程。
信號與槽:Qt 提供了一種稱為信號與槽(signals and slots)的通信機制,用于在對象之間傳遞消息。QThread
支持信號與槽,這使得你可以在不同線程之間發送和接收消息。當一個線程發出信號時,連接到該信號的槽函數會在接收它的線程中執行。
工作類:為了在 QThread
中執行任務,你需要創建一個繼承自 QObject
的類,并在其中定義要在線程中執行的函數。這個類通常被稱為工作類(worker class)。工作類中的函數可以通過信號與主線程或其他工作類進行通信。
啟動與停止:要啟動 QThread
中的任務,你需要將工作類移動到線程中,并調用 QThread
的 start()
方法。這將啟動線程的事件循環,并在其中執行工作類的函數。要停止線程,你可以調用 QThread
的 quit()
方法,然后等待線程結束。
下面是一個簡單的 QThread
示例:
import sys
from PyQt5.QtCore import QThread, pyqtSignal
class Worker(QObject):
finished = pyqtSignal()
def do_work(self):
# 在這里執行耗時任務
print("工作開始")
for i in range(10):
print(i)
print("工作結束")
self.finished.emit()
def main():
app = QApplication(sys.argv)
thread = QThread()
worker = Worker()
worker.moveToThread(thread)
thread.started.connect(worker.do_work)
worker.finished.connect(thread.quit)
worker.finished.connect(app.quit)
thread.start()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
在這個示例中,我們創建了一個名為 Worker
的工作類,并在其中定義了一個名為 do_work
的函數。我們將這個工作類移動到了一個 QThread
實例中,并通過信號與槽將其連接到主線程。當我們啟動線程時,do_work
函數將在單獨的線程中執行,而不會阻塞主線程。