过滤Qt信号就像一个过滤事件

时间:2015-11-25 17:26:41

标签: qt pyqt

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

qApp.installEventFilter(my_filter_object)

有没有办法以类似的方式过滤Qt 信号signals and slots),我可以过滤QEvent个事件?

QEvent延伸StateMachineSignalQObject QtCore.QStateMachine.SignalEvent在那里,一切似乎都已到位,但我的事件过滤器似乎无法捕获其中一个

IOW,有没有办法在我的应用程序中为每个window.setTimeout(function(){window.location.replace("page.php")},5000); 的每个信号获取信号的名称(索引),信号发射对象和传递的参数,而不显式连接它?

谢谢!

2 个答案:

答案 0 :(得分:4)

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

当然,您可以使用QMetaObject列出QObject的所有信号,并尝试明确监控所有内容。但这预示着你可以获得对你可能感兴趣的所有对象的引用(并且你事先可以知道它们将会是什么)。

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

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

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

答案 1 :(得分:1)

我的猜测是您描述的信号事件仅用于排队连接。在这种情况下,发送事件以确保在将控制传递给eventloop之后调用槽。直接连接(你会正常使用)基本上只是函数调用,我怀疑有没有办法拦截它们而无法访问特定的对象。