问题点
目前查阅了很多资料,有关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种连接模式