pyqt5-多线程QThread类
要实现多线程,我们要先继承QThread类并重新实现其中的run()函数,也就是说把耗时的操作放入run()函数中
1 import sys 2 from PyQt5.QtCore import Qt, QThread,pyqtSignal 3 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout,QHBoxLayout 4 5 6 class Demo(QWidget): 7 def __init__(self): 8 super(Demo, self).__init__() 9 10 self.button = QPushButton('开始', self) 11 self.button.clicked.connect(self.count_func) 12 self.button_2 = QPushButton('停止', self) 13 self.button_2.clicked.connect(self.stop_count_func) 14 15 self.label = QLabel('0', self) 16 self.label.setAlignment(Qt.AlignCenter) 17 18 self.my_thread = MyThread()#实例化线程对象 19 self.my_thread.my_signal.connect(self.set_label_func) 20 #线程自定义信号连接的槽函数 21 22 self.h_layout = QHBoxLayout() 23 self.v_layout = QVBoxLayout() 24 self.h_layout.addWidget(self.button) 25 self.h_layout.addWidget(self.button_2) 26 self.v_layout.addWidget(self.label) 27 self.v_layout.addLayout(self.h_layout) 28 self.setLayout(self.v_layout) 29 30 31 def stop_count_func(self): 32 self.my_thread.is_on = False 33 self.my_thread.count = 0 34 35 def count_func(self): 36 self.my_thread.is_on = True 37 self.my_thread.start()#启动线程 38 39 def set_label_func(self, num): 40 self.label.setText(num) 41 #由于自定义信号时自动传递一个字符串参数,所以在这个槽函数中要接受一个参数 42 43 44 class MyThread(QThread):#线程类 45 my_signal = pyqtSignal(str) #自定义信号对象。参数str就代表这个信号可以传一个字符串 46 def __init__(self): 47 super(MyThread, self).__init__() 48 self.count = 0 49 self.is_on = True 50 51 52 def run(self): #线程执行函数 53 while self.is_on : 54 print(self.count) 55 self.count += 1 56 self.my_signal.emit(str(self.count)) #释放自定义的信号 57 #通过自定义信号把str(self.count)传递给槽函数 58 59 self.sleep(1) #本线程睡眠n秒【是QThread函数】 60 61 62 if __name__ == '__main__': 63 app = QApplication(sys.argv) 64 demo = Demo() 65 demo.show() 66 sys.exit(app.exec_())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了