使用Qt,我可以过滤我的应用程序接收或生成的所有QEvent
事件:
qApp.installEventFilter(my_filter_object)
有没有办法以类似的方式过滤Qt 信号(signals and slots),我可以过滤QEvent
个事件?
QEvent
延伸StateMachineSignal
,QObject
QtCore.QStateMachine.SignalEvent
在那里,一切似乎都已到位,但我的事件过滤器似乎无法捕获其中一个
IOW,有没有办法在我的应用程序中为每个window.setTimeout(function(){window.location.replace("page.php")},5000);
的每个信号获取信号的名称(索引),信号发射对象和传递的参数,而不显式连接它?
谢谢!
答案 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之后调用槽。直接连接(你会正常使用)基本上只是函数调用,我怀疑有没有办法拦截它们而无法访问特定的对象。