关于pyqt,pyside2信号与槽函数同步的问题

问题点

目前查阅了很多资料,有关c语言qt的解决方案很多,但还没看到python语言qt的解决方案,这里记录一下

connect()模式

1,QueedConnection

这是pyqt的默认模式。信号signal发送emit发送出去后slot函数会在receiver所在的线程的event loop中进行处理。第二次signal发送并不需要等待第一次发送后槽函数执行完毕。这样信号和槽函数就无法在时序上依次执行

from PySide2 import QtCore
from PySide2.QtCore import QObject, QThread
from PySide2.QtWidgets import QApplication, QMainWindow
from ui_py.QT_Demo import Ui_MainWindow
from QT_Thread import ThreadSendMsg, ThreadSendMsg2
import sys,time,threading

class CMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.threadSendMsg = ThreadSendMsg()
        #self.threadSendMsg.transData.connect(self.displayMsg,QtCore.Qt.BlockingQueuedConnection)
        self.threadSendMsg.transData.connect(self.displayMsg)
        self.ui.pushButton.clicked.connect(self.msgSendLoop)
       
    def msgSendLoop(self):
        self.threadSendMsg.start()
        
    def displayMsg(self,text):
        self.ui.textBrowser.append(text)
        QApplication.processEvents()
        print("DDDDDDDDDDDDDDDD")#每次调用记录槽函数的输出
        time.sleep(3)



class ThreadSendMsg(QThread):
    transData = QtCore.Signal(str)
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            time.sleep(0.5)
            self.transData.emit("这是线程消息")
            print(11111)#记录每次信号的发送

然后执行结果为
在这里插入图片描述
可以看到信号很快全部发送完了,但槽函数还在慢慢一步一步执行。
信号的发送和槽函数的执行并没有同步

2,BlockingQueuedConnection

这种连接模式需要自行设置。
在connect()函数添加参数QtCore.Qt.BlockingQueuedConnection
connect(槽函数,QtCore.Qt.BlockingQueuedConnection)
将上方代码注释切换

self.threadSendMsg.transData.connect(self.displayMsg,QtCore.Qt.BlockingQueuedConnection)
#self.threadSendMsg.transData.connect(self.displayMsg)

然后执行结果为
在这里插入图片描述
这样信号发送将和槽函数执行,在时序上严格一一对应。
其原理为:在emit()将信号发送出去后,线程将阻塞,emit()后面的语句将无法执行。直到slot()槽函数完全执行完毕。线程才会恢复,继续执行emit()后的语句。

3,AutoConnection

4,DirectConnection

5,UniqueConnection

这是剩下的3种连接模式

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值