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