调试Qt信号、槽和连接

14
有没有一种方法可以查看哪些信号被触发,以及它们是否连接到插槽?理想情况下,我们希望能够查看所有信号,而不仅仅是特定类或方法的信号;例如,QSignalSpy只允许我们跟踪特定实例的特定信号。
在我们的应用程序中,由于来自不同组件的信号被触发两次,我们看到了性能问题。最后,结果是应该只有一个类的第二个实例。知道确切发出哪些信号有助于调试此问题。
通过QMetaObject::invoke*调用信号,我希望能找到其中可插入的内容,但我未发现明显的痕迹。

可能是如何在QT中拦截所有发射的信号?的重复问题。 - exilit
如果你只想要一个类的实例,为什么不使用单例模式来控制对象的数量呢? - Afshin
2个回答

5
(免责声明,我在KDAB工作):KDAB的GammaRay工具可以在运行时显示对象和连接,而不需要进行任何源代码更改。它检查元对象表并执行一些代码注入钩子以使其正常工作。

1
我从git仓库构建了GammaRay,但无法找到显示连接的位置(使用Qt 5.7构建);信号面板只显示发射的刻度。我能做的最好的替代方法是在qobject.cpp中删除QT_DEBUG的检查,并调用dumpObjectInfo()以查看对象的所有信号/槽连接,否则对于我的-debug-and-release配置的Qt构建,它不会打印任何内容。 - remikz

1

QSignalSpy 可以帮助你。

从文档中可以看到,

QSignalSpy 类使信号发射的内省成为可能。QSignalSpy 可以连接到任何对象的任何信号并记录其发射。

文档中也有示例。


1
我知道Signal Spy,抱歉没有提到它。它的缺点是它不能让我看到所有发出的信号,只能看到单个类或实例的特定信号签名。 - Ivo
@Ivo,我不确定是否有任何东西列出所有发出的信号,但是QSignalMapper可以跟踪指定实例发出的信号。 - liaK
Qt内部维护了一个信号列表,其中包含至少包含信号名称和签名的结构体。从查看代码中我所了解到的就是这些。然而,不幸的是,这个信息被深深地隐藏在Qt中。 - Ivo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接