我在Python 3.7
工作。 python Qt版本Pyqt5
使您可以触发自定义pyqt信号。例如:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyClass(QObject):
mysignal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.mysignal.connect(self.bar)
return
def foo(self):
self.mysignal.emit("foobar")
return
@pyqtSlot
def bar(self, mystr):
print("signal received: {0}".format(mystr))
return
PyQt在主线程中启动一个事件监听器循环:它等待队列上的传入事件并逐个处理它们。大多数这些事件都是用户调用的东西,如按下按钮,点击某些内容,......
如果以编程方式触发pyqt信号,就像上面的foo()
函数一样,你也将事件推送到这个队列(我想)。这应该不是什么大问题,除非你在短暂的爆发中发射过多的pyqt信号。队列不堪重负,用户事件无法及时处理。用户看到了冻结的GUI。哎呀!
解决这个问题的一种方法是将低优先级分配给以编程方式触发的pyqt信号。这可能吗?怎么样? 如果没有 - 你知道解决问题的其他方法吗?
在直接连接(同一线程中的发送器和接收器)的情况下,当您发出信号时,将直接调用插槽。
因此,在您的示例中,您可以通过直接调用self.bar
来替换您的发射。
但是,如果您的插槽太长,事件循环必须等待它才能处理用户事件。
如果在调用插槽时UI处于冻结状态,则意味着您应该使用另一个线程让事件循环处理用户事件。