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)
# 带一个参数data
def __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)
# 线程连接接受函数receive
self.Push.signal.connect(self.receive)
# 启动线程
self.push.start()
# 接收线程传来的事件 run函数i==msg接收
def receive(self,msg):
print(msg)
# 输出到textBrowser
self.textBrowser.setText(str(msg))