如何拦截 Qt 中给定事件发出的所有信号?
我可以想象,根据事件的不同,可能会有相当多的错误,但同时,我想这可能是最好的调试方法,也是一个有趣的教训。
我为什么需要它?我正在使用一些基于QWidget
的自定义类,当我在同一窗口中取消附加QDockWidget
时,该自定义类不会扩展。了解取消连接此停靠小部件时发出的信号将帮助我选择需要在自定义类中覆盖的方法。
换句话说,我不想检查文档中的每个可能的信号,而是只想查看当我在应用程序中执行某些操作时发出哪些信号。
I can imagine that there might be quite a few of them depending on the event, but at the same time, I guess this can be a best way to debug, and an interesting lesson.
Why would I need it? I'm using some custom class based on the QWidget
, which does not expand when I de-attach a QDockWidget
based in the same window. Knowing what signals are emitted when this dock widget is being de-attached would help me to chose which method I need to overwrite in my custom class.
In other words, I don't want to check every possible signal from the documentation, but just see which signals are emitted when I perform some action in my application.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这对于任何公共 API 来说都是不可能的。
但是,如果您将代码放入基于 QTestLib 的单元测试中,则可以使用
-vs
运行单元测试以打印出每个发出的信号。This isn't possible with any public API.
But, if you put your code into a QTestLib-based unit test, you can run the unit test with
-vs
to print out every emitted signal.您可能想查看 QSignalSpy 类。
我认为虽然你必须手动连接你想要监视的信号。
You may want to take a look at the QSignalSpy class.
I think though you have to connect manually the signal you want to spy.
我认为 Qt 不可能做到这一点。您可以
但我被困在这之后。我认为,除了发送者之外,还无法获得有关插槽如何被调用的任何信息。
I don't think this is possible with Qt. You can
But I'm stuck after this. I don't think that, besides the sender, any information can be obtained about how a slot got invoked.
如果您使用 PyQT5 而不是 Qt5,则可以使用 Python 的自省功能来查找任何类的所有信号并将它们连接到(虚拟对象的)虚拟插槽。
虚拟插槽现在打印有关对象发出的所有信号的信息。
例如,如果您像这样监视随机 QLineEdit:
进入和退出行编辑的可能日志可能如下所示:
If you're using PyQT5 instead of Qt5, you can use Python's introspection abilities to find all signals of any class and connect them to a dummy slot (of a dummy object).
The dummy slot now prints info about all signals emitted by an object.
For example, if you spy on a random QLineEdit like this:
A possible log of entering and exiting the line edit might look like this:
查看信号间谍。对 QT 库和监视信号/槽有了一些深入的了解。
Check out signal spying. Got some great insight of QT library and spying on signals/slots.