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

问题描述 投票:0回答:2

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

QEvent
事件:

qApp.installEventFilter(my_filter_object)

有没有办法以类似的方式过滤 Qt signalssignals 和 slot),我可以过滤

QEvent
事件?

随着

QtCore.QStateMachine.SignalEvent
延伸
QEvent
,并且
StateMachineSignal
QEvent.Type
在那里,一切似乎都已就位,但我的事件过滤器似乎无法捕获其中之一。

IOW,对于我的应用程序中每个

QObject
的每个信号,有什么方法可以获取信号名称(索引)、信号发射对象和传递的参数,而无需显式连接到它?

谢谢!

qt events pyqt signals-slots
2个回答
6
投票

不。用于监视信号的唯一通用 API 是QSignalSpy,但这需要与特定对象和信号的显式连接。唯一的另一件事是 TestLib 框架,它有一个 命令行选项 (

-vs
),可以在测试运行期间输出所有发出的信号。但这似乎与您的要求相去甚远。

当然,您可以使用 QMetaObject 列出

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

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


但是,关联的事件对象属于

QMetaCallEvent

类型,它是一个未由 PyQt 包装的内部 Qt 类。通常,这些对象将具有

id()
sender()
signalId()
args()
方法。但在 PyQt 中,您得到的只是一个普通的
QEvent
,因此无法获得有关发出信号的信息。

即使

QMetaCallEvent

was
可用,默认连接类型也是 not 排队 - 并且无法全局重置所有信号的默认值。


1
投票

© www.soinside.com 2019 - 2024. All rights reserved.