一、QThread概述
QThread是PyQt中使用多線程最常用的類之一,其可以在後台執行耗時操作,不會阻塞主線程的UI響應。
在PyQt中,單線程指的是只有一個Qt信號事件循環(QEventLoop),所有信號和槽函數都是在這個循環中處理的。在UI線程中執行耗時操作會阻塞循環,導致UI無響應,QThread可以實現將耗時操作放到另一個線程中執行,同時不影響UI線程。
二、QThread使用
1.繼承QThread方式:
from PyQt5.QtCore import QThread, pyqtSignal class MyThread(QThread): start_signal = pyqtSignal(int) # 自定義信號 def __init__(self): super().__init__() def run(self): self.start_signal.emit(0) # 發射信號
2.重寫QRunnable方式:
from PyQt5.QtCore import QRunnable class MyRunnable(QRunnable): def __init__(self): super().__init__() def run(self): pass # 執行耗時操作
三、QThread的信號
QThread自帶了一些信號,可以用來在進程間通信。常用的信號有:
- started:線程開始執行
- finished:線程執行結束
- terminated:線程被強制終止
- error:線程發生錯誤
除此之外還可以自定義信號,用來在線程內和線程間傳遞數據。
四、QThread的常用方法
1.start:啟動線程
2.terminate:終止線程
3.wait:等待線程執行結束
五、QThread的注意點
1.不要在子線程中直接操作UI,因為UI只能在主線程中更新
2.不要在主線程中等待子線程的結束,會導致UI卡頓
3.不要在子線程中使用PyQt的全局變量或模塊,因為它們可能會與主線程產生衝突
六、完整示例
from PyQt5.QtCore import QThread, pyqtSignal class MyThread(QThread): start_signal = pyqtSignal(int) # 自定義信號 def __init__(self): super().__init__() def run(self): for i in range(10): self.start_signal.emit(i) # 發射信號 if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel class MyWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel(self) self.label.move(50, 50) self.thread = MyThread() self.thread.start_signal.connect(self.update_label) # 連接信號 self.thread.start() # 啟動線程 def update_label(self, n): self.label.setText(str(n)) self.label.adjustSize() app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
原創文章,作者:YLXPU,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/317233.html