一、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-hant/n/317233.html
微信掃一掃
支付寶掃一掃