【问题标题】:Filter Qt signals like one filters events像过滤事件一样过滤 Qt 信号
【发布时间】:2015-11-25 17:26:41
【问题描述】:

使用 Qt,我可以过滤我的应用程序接收或产生的所有 QEvent 事件:

qApp.installEventFilter(my_filter_object)

有什么方法可以过滤 Qt 信号signals and slots),就像过滤 QEvent 事件一样?

随着QtCore.QStateMachine.SignalEvent 扩展QEventStateMachineSignal QEvent.Type 在那里,一切似乎都到位,但我的事件过滤器似乎无法捕捉其中之一。

IOW,对于我的应用程序中每个QObject 的每个信号,是否有任何方法可以获取信号的名称(索引)、信号发射对象和传递的参数,而无需显式连接到它?

谢谢!

【问题讨论】:

    标签: qt pyqt


    【解决方案1】:

    没有。用于监视信号的唯一通用 API 是 QSignalSpy,但这需要显式连接到特定对象和信号。唯一的另一件事是TestLib Framework,它有一个command-line option (-vs),可以在测试运行期间输出所有发射的信号。但这似乎与您的要求相去甚远。

    当然,您可以使用QMetaObject 列出QObject 的所有信号并尝试显式监控所有内容。但前提是您可以获得对您可能感兴趣的所有对象的引用(并且您实际上可以提前知道它们将是什么)。

    上述情况的唯一例外是通过queued connection 发出的信号。这些信号通常是跨线程发出的,它们被包装在一个事件中并发布到接收者线程的事件队列中。可以通过过滤QEvent.MetaCall 类型的事件来检测这些类型的信号。

    但是,关联的事件对象是QMetaCallEvent 类型,它是一个内部Qt 类,没有被PyQt 包装。通常,这些对象将具有id()sender()signalId()args() 方法。但在 PyQt 中,你得到的只是一个普通的 QEvent,因此不会提供有关发射信号的信息。

    即使QMetaCallEvent 可用,但默认连接类型排队 - 并且无法全局重置所有信号的默认值。

    【讨论】:

      【解决方案2】:

      我的猜测是您描述的信号事件仅用于排队连接。在这种情况下,发送事件以确保在将控制权传递给事件循环后调用插槽。直接连接(您通常会使用)本质上只是函数调用,我怀疑是否有一种方法可以在不访问特定对象的情况下拦截它们​​。

      【讨论】:

        猜你喜欢
        • 2018-09-07
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多