代码之家  ›  专栏  ›  技术社区  ›  K.Mulier

PyQt5:如何设置pyqtSignal的优先级?

  •  0
  • K.Mulier  · 技术社区  · 7 年前

    一。背景信息

    我在里面工作 Python 3.7 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
    


    2。问题

    事件侦听器循环 在主线程中:它等待队列上的传入事件,并逐个处理它们。这些事件大多是用户调用的,比如按下按钮、单击某个东西。。。

    如果以编程方式触发pyqt信号,如 foo() 上面的函数,您还可以将事件推送到这个队列(我想)。这应该没什么大不了的,除非你在短时间内发出过多的pyqt信号。队列被淹没,用户事件无法及时处理。用户看到一个冻结的GUI。


    解决这个问题的一个方法是给程序触发的pyqt信号分配低优先级。这可能吗?怎么用?
    如果没有-你知道其他解决问题的方法吗?

    0 回复  |  直到 7 年前
        1
  •  0
  •   Dimitry Ernot    7 年前

    如果是直接连接(发送方和接收方在同一个线程中),则在发出信号时将直接调用插槽。

    因此,在您的示例中,您可以替换 发出 直接打电话给 self.bar .

    如果在调用槽时用户界面冻结,这意味着您应该使用另一个线程让事件循环处理用户事件。