pyqt5 多线程QThread自学记录

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中自定义信号,通过鼠标点击发送事件
自定义信号和槽:自定义信号和槽

pyqt5 多线程QThread自学记录_第1张图片

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))
	
	

你可能感兴趣的:(Pyqt5,qt,开发语言,python)