调试Qt信号,插槽和连接

调试Qt信号,插槽和连接

问题描述:

有没有办法查看哪些信号被触发,以及是否有插槽连接到它们?理想情况下,我们希望看到所有信号,而不仅仅是特定类别或方法的信号。例如QSignalSpy只允许我们跟踪特定实例的特定信号。调试Qt信号,插槽和连接

在我们的应用程序中,我们发现性能问题是由于信号从不同组件发出两次。最后,事实证明,应该只有一次这种类的第二个实例。知道发射哪些信号恰好有助于调试。

信号通过QMetaObject::invoke*调用,我希望能找到某些东西来挂钩,但我没有发现任何明显的信号。

+0

可能重复[如何拦截QT中给定事件发出的所有信号?](http://*.com/questions/2072013/how-to-intercept-all-signals-emitted-by-a- given-event-in-qt) – exilit 2014-10-16 07:36:52

+0

如果你想只有一个类的实例,为什么不使用单例模式来控制对象的数量? – Afshin 2016-05-07 13:23:15

QSignalSpy可以帮到你。

从文档,

的QSignalSpy类使信号emission.QSignalSpy的内省可以连接到任何物体的任何信号,并记录它的发射。

的文档有例子太..

+1

我知道信号间谍,抱歉不提这个。它的缺点是,它不允许我看到*所有*发射的信号,只是一个类或实例的特定信号签名。 – Ivo 2010-09-20 12:12:30

+0

@Ivo,我不确定是否有任何列出所有发出的信号,但是'QSignalMapper'是跟踪来自指定实例的信号。 – liaK 2010-09-20 12:30:01

+0

Qt在内部维护一个信号列表,它是一个至少包含一个结构的结构包含信号名称和签名的字符串。我从查看代码中收集了很多。然而,不幸的是,这在Qt中埋得很深。 – Ivo 2010-09-20 15:01:45

(免责声明,我的工作KDAB):KDAB的GammaRay tool可以在运行时显示你的对象和连接,而不需要任何来源的变化。它检查元对象表并执行一些代码注入挂钩以使其工作。

+1

我从git repo构建了GammaRay,但无法找到连接显示的位置(使用Qt 5.7构建);信号面板只显示发射抽动。我可以做的最好的替代方法是在qobject.cpp中删除对QT_DEBUG的检查,并调用dumpObjectInfo()来查看对象的所有信号/插槽连接,否则它不打印我的-debug-and-release配置的Qt build 。 – 2017-01-07 21:57:26