要使用QThread开始一个线程,可以创建它的一个子类,然后覆盖其
QThread.run()
函数。
方法 | 描述 |
---|---|
start() | 启动线程 |
wait() | 阻止线程,直到满足如下条件之一:1、与此QThread对象关联的线程已完成执行(即从run()返回时)。如果线程完成执行,此函数将返回True;如果线程尚未启动,此函数也返回True。2、等待时间的单位是毫秒。如果时间是ULONG_MAX(默认值),则等待,永远不会超时(线程必须从run()返回);如果等待超时,此函数将返回False。 |
sleep(s) | 强制当前线程睡眠s秒 |
信号 | 描述 |
---|---|
started | 在开始执行run()函数之前,从相关线程发射此信号 |
finished | 当程序完成业务逻辑时,从相关线程发射此信号 |
import sys
from PyQt5 import QtCore
from 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()
,那么就可以实现一边执行耗时程序,一边刷新页面的功能,给人的感觉就是程序运行很流畅。
运行效果如下: