像过滤事件一样过滤Qt信号

像过滤事件一样过滤Qt信号,qt,pyqt,Qt,Pyqt,使用Qt,我可以过滤应用程序接收或生成的所有QEvent事件: qApp.installEventFilter(my_filter_object) 有没有什么方法可以像我可以过滤QEvent事件那样过滤Qt信号(of) 随着扩展QEvent和StateMachineSignal的出现,一切似乎都准备就绪,但我的事件过滤器似乎无法捕获其中一个 那么,对于我的应用程序中每个QObject的每个信号,是否有任何方法可以获取信号的名称(索引)、信号发出对象和传递的参数,而无需显式连接到它 谢谢 否。监

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

qApp.installEventFilter(my_filter_object)
有没有什么方法可以像我可以过滤
QEvent
事件那样过滤Qt信号(of)

随着扩展
QEvent
StateMachineSignal
的出现,一切似乎都准备就绪,但我的事件过滤器似乎无法捕获其中一个

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


谢谢

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

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

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

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


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

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