本文共 1874 字,大约阅读时间需要 6 分钟。
要使用QThread开始一个线程,可以创建它的一个子类,然后覆盖其
QThread.run()
函数。
方法 | 描述 |
---|---|
start() | 启动线程 |
wait() | 阻止线程,直到满足如下条件之一:1、与此QThread对象关联的线程已完成执行(即从run()返回时)。如果线程完成执行,此函数将返回True;如果线程尚未启动,此函数也返回True。2、等待时间的单位是毫秒。如果时间是ULONG_MAX(默认值),则等待,永远不会超时(线程必须从run()返回);如果等待超时,此函数将返回False。 |
sleep(s) | 强制当前线程睡眠s秒 |
信号 | 描述 |
---|---|
started | 在开始执行run()函数之前,从相关线程发射此信号 |
finished | 当程序完成业务逻辑时,从相关线程发射此信号 |
import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *class Demo(QWidget): def __init__(self): super().__init__() self.setGeometry(100, 50, 500, 400) self.setWindowTitle('QThread') self.thread = Worker() self.list = QListWidget() self.btn = QPushButton('开始') layout = QGridLayout(self) layout.addWidget(self.list,0,0,1,2) layout.addWidget(self.btn,1,1) self.btn.clicked.connect(self.slotStart) self.thread.sinOut.connect(self.slotAdd) def slotAdd(self,inf): self.list.addItem(inf) #实时刷新页面 QApplication.processEvents() def slotStart(self): self.btn.setEnabled(False) self.thread.start()class Worker(QThread): #自定义信号 sinOut = pyqtSignal(str) def __init__(self): super().__init__() self.working = True self.num = 0 def __del__(self): self.working = False self.wait() def run(self): while self.working == True: file_str = 'File index{0}'.format(self.num) self.num += 1 #发射信号 self.sinOut.emit(file_str) #休眠2秒 self.sleep(2)if __name__ == "__main__": app = QApplication(sys.argv) form = Demo() form.show() sys.exit(app.exec_())
注:
由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿;而如果在执行这个耗时程序时不断地运行QApplication.processEvents()
,那么就可以实现一边执行耗时程序,一边刷新页面的功能,给人的感觉就是程序运行很流畅。
运行效果如下:
转载地址:http://ptozi.baihongyu.com/