使用 Qt,我可以过滤我的应用程序接收或生成的所有
QEvent
事件:
qApp.installEventFilter(my_filter_object)
有没有办法以类似的方式过滤 Qt signals(signals 和 slot),我可以过滤
QEvent
事件?
QtCore.QStateMachine.SignalEvent
延伸 QEvent
,并且 StateMachineSignal
QEvent.Type
在那里,一切似乎都已就位,但我的事件过滤器似乎无法捕获其中之一。
IOW,对于我的应用程序中每个
QObject
的每个信号,有什么方法可以获取信号名称(索引)、信号发射对象和传递的参数,而无需显式连接到它?
谢谢!
不。用于监视信号的唯一通用 API 是QSignalSpy,但这需要与特定对象和信号的显式连接。唯一的另一件事是 TestLib 框架,它有一个 命令行选项 (
-vs
),可以在测试运行期间输出所有发出的信号。但这似乎与您的要求相去甚远。
当然,您可以使用 QMetaObject 列出
QObject
的所有信号,并尝试显式监视所有内容。但这的前提是您可以获得对您可能感兴趣的所有对象的引用(并且您实际上可以提前知道它们将是什么)。
上述唯一的例外是通过“排队连接”发出的信号。这些信号最常跨线程发出,被包装在事件中并发布到接收者线程的事件队列中。可以通过过滤 QEvent.MetaCall
类型的事件来检测此类信号。
但是,关联的事件对象属于
QMetaCallEvent
类型,它是一个未由 PyQt 包装的内部 Qt 类。通常,这些对象将具有
id()
、sender()
、signalId()
和 args()
方法。但在 PyQt 中,您得到的只是一个普通的 QEvent
,因此无法获得有关发出信号的信息。即使
QMetaCallEvent
was可用,默认连接类型也是 not 排队 - 并且无法全局重置所有信号的默认值。