pyqt5多线程QThread自学记录
在编写qt的时候不加入多线程,运行程序往往会导致主进程卡死,比如执行下载某视频或者其他执行比较耗时的程序,泛滥了博客,就是没有理解怎么进行槽函数的关联和传递的
经过长时间的攻克,终于胜利记录如下
1.在qt中普通的槽函数关联
self.pushButton.clicked.connect(self.print)
def print(self)print("我被点击了。。。")
或者
# 需要引入 pyqtSlot 库函数
from PyQt5.QtCore import pyqtSlot@pyqtSlot() #装饰器,此函数没有connect直接通过装饰器初始化连接槽函数
def on_pushButton_clicked(self)print("我点击了")
这样的连接槽函数,在我们程序运行耗时较长就会导致我们主进程卡死,同时也不能操作qt其他的小部件或者程序,所以就要使用到多线程,这里的多线程不是thread,threading,而是qt提供的QThread
2.如何使用QThread呢,首先我们要明白qt中自定义信号,通过鼠标点击发送事件
在这里插入图片描述
import time
from PyQt5.QtCore import QThread, pyqtSignal
# 自定义一个线程类继承QThread
class Puth_Thread(QThread):#自定义信号声明signal = pyqtSignal(str)# 带一个参数datadef __init__(self,data,parent=None):super(Puth_Thread, self).__init__(parent)# 重写run函数,这个run函数就是我们的子线程需要执行的内容def run(self):for i in range(data):time.sleep(1)#通过emit发射自定义信号,同时向主程序发送一个i的参数self.signal.emit(str(i))# 注意这里与signal = pyqtSignal(str)中的类型相同
我们主程序导入Puth_Thread
# 主程序pushButton连接槽函数start
self.pushButton.clicked.connect(self.start)
# 定义槽函数
def start(self):# 调用Puth_Thread 并传递参数self.Push =Puth_Thread(100)# 线程连接接受函数receiveself.Push.signal.connect(self.receive)# 启动线程self.push.start()
# 接收线程传来的事件 run函数i==msg接收
def receive(self,msg):print(msg)# 输出到textBrowserself.textBrowser.setText(str(msg))