软硬件环境
- Windows 10 64bit
- Anaconda3 with python 3.7
- PyCharm 2019.3
- PyQt5
视频看这里
此处是youtube
的播放链接,需要科学上网。喜欢我的视频,请记得订阅我的频道,打开旁边的小铃铛,点赞并分享,感谢您的支持。
简介
QThread
是Qt
线程类中最核心的底层类。要使用QThread
开始一个线程,必须创建一个QThread
的子类,然后重写QThread.run
方法。在使用线程时,可以直接得到Thread
实例,调用其start()
方法即可启动线程。
一般来讲,业务的线程任务就放在run
方法中,当run
退出之后,线程就结束了。QThread
有started
和finished
信号,可以为这两个信号绑定相应的槽函数,在线程启动启动和结束时执行一些代码来记性资源的初始化和释放的动作。
实例
使用designer.exe
制作UI
界面,一个label
和一个pushbutton
,并且使用水平布局,如下
将界面保存成qthread.ui
文件,然后利用pyuic5.exe
生成python
代码
pyuic5.exe -o ui_mainwindow.py qthread.ui
首先来到工程的入口函数main.py
,初始化app
并进入事件循环
import sys
from PyQt5.QtWidgets import QApplication
from gui.mainwindow import MainWindow
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
我们着重看下mainwindow.py
import time
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QThread, pyqtSignal
from .ui_mainwindow import Ui_MainWindow
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.thread = Worker()
self.thread.sig.connect(self.updateLabel)
self.pushButton.clicked.connect(self.buttonClicked)
def buttonClicked(self):
self.thread.start()
def updateLabel(self, text):
self.label.setText(text)
class Worker(QThread):
sig = pyqtSignal(str)
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
self.count = 0
def run(self):
while True:
time.sleep(1)
self.count += 1
if (self.count % 5 == 0):
self.sig.emit(f"已执行{self.count}秒")
可以看到,我们定义了一个Worker
,继承自QThread
,并且实现了run()
方法,使用time.sleep
来模拟耗时操作,当计数器count
对5来取余为0时,发送信号sig
,更新label
的文本。
运行下工程