我已将自己注入Qt应用程序,并且我试图找出给定插槽连接的信号,但无法找到有关此操作的任何信息。是否有开箱即用的机制?如果是这样,这是否暴露于QtScript? (如果没有,我可以很容易地包装它。)
如果没有这样的机制,最好的添加方法是什么?我无法在简单的钩子之外操纵现有的应用程序,但我可以自己挂钩QObject :: connect并存储连接,只是不确定这是否是最好的方法。
答案 0 :(得分:28)
我认为Qt存储了给定信号所连接的插槽,因此当您发出它时,所有接收器都被调用,因此您可以访问接收器列表:
出于调试目的,您有:
void QObject :: dumpObjectInfo()
转储有关信号的信息 这个对象的连接等 调试输出。
此功能对调试很有用, 但如果图书馆有什么,什么都不做 已在发布模式下编译(即 没有调试信息)。
信号连接的插槽列表:
int QObject :: receivers(const char * 信号)const [protected]
返回接收者的数量 连接到信号。
metaObject()为您提供了插槽的QMetaMethod,但它没有关于其连接的信息。
但是,如果您知道对象,则可以遍历所有信号(使用元对象,测试信号的方法类型)并使用接收器()给出的插槽构建反向索引。
答案 1 :(得分:9)
如果不保留Qt的内部互斥锁/信号量,就无法安全地迭代信号槽连接列表。信号和插槽可以随时进出,所以最多只能获得一个无法保证正确的列表 - 因此无用。
无论你在QObject::connect
做什么钩子本身都不够。从这种钩子中获得的数据将受到以下影响:
您可能有指向在您尝试访问时已删除的对象的指针。您可以使用QPointer
来缓解此问题,但这仅适用于运行代码的线程中的对象。您需要将对象注入其他线程以收集对象列表。
您可能已经存在不再存在的联系。即使挂钩QObject::disconnect
也不够,因为当对象不再存在时删除连接。
您面临的问题非常复杂,任何强大的解决方案都不仅限于“挂钩”。 QObject::connect
。
唉,你还没有说为什么你需要附加到插槽的信号列表。它的目的是什么?
答案 2 :(得分:3)
在Qt代码库和文档中挖掘后(我从这里和其他地方得到了很多有用的提示),我最终决定挂钩QObject :: connect(静态重载)。为什么?那么,其他解决方案要求您知道哪些对象提供信号,挖掘私有字段,或者必须具有Qt的调试版本。最后,挂钩QObject :: connect为您提供应用程序中连接的所有内容,您可以轻松地映射回插槽。