首先,創建一個類繼承 QThread
,並在 run()
方法中定義執行的功能。接著,在窗口中創建線程實例,並使用 start() 來啟動線程,這樣耗時操作將在背景中執行,而不會阻塞主線程。
from PySide6.QtWidgets import QApplication , QWidget
from PySide6.QtCore import QThread
import time
class MyThread(QThread):
def run(self):
for i in range(5):
print(f"計數: {i}")
time.sleep(1) # 模擬耗時操作
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 創建並啟動線程
self.thread = MyThread()
self.thread.start()
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
started.connect(function)
: 當線程啟動時觸發,執行指定的函數或操作。finished.connect(function)
: 當線程執行完成後觸發,通常與 deleteLater()
搭配使用,用來在任務完成後安全地刪除線程對象,釋放資源。deleteLater()
是用於延遲刪除 Qt 對象的方法,保證在下次事件循環時安全地釋放內存。範例使用 QThread
在後台進行計數操作,並通過自訂信號,更新標籤文字。同時,在開始與結束時信號觸發顯示文字。
import time
from PySide6.QtWidgets import QMainWindow , QApplication, QWidget , QLabel
from PySide6.QtCore import QThread , Signal
class Work(QThread) :
#自訂信號
update_lb = Signal(str)
def run(self):
for i in range(1,6):
time.sleep(1)
self.update_lb.emit(f"計數: {i}")
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.resize(50,50)
# 設定標籤
self.lb = QLabel("尚未開始",self)
self.lb.setGeometry(0,0,50,50)
#建立執行緒
self.WorkThread = Work()
self.WorkThread.update_lb.connect(self.lb.setText)
self.WorkThread.start()
#設定信號
self.WorkThread.started.connect(lambda: print("開始執行線程"))
self.WorkThread.finished.connect(lambda: print("線程結束了"))
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
QThread 使用 : 首先建立一個類,通過繼承 QThread
, 然後將需要的功能放入 run()
,就可以將工作,移動到線程中執行,避免主線程卡頓。
QThread 常用的信號
功能 | 方法 |
---|---|
開始線程時觸發 | started.connect(function) |
結束線程時觸發 | finished.connect(function) |