一、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_())