确定连接到Qt中给定插槽的信号

时间:2010-05-03 01:10:58

标签: qt signals-slots

我已将自己注入Qt应用程序,并且我试图找出给定插槽连接的信号,但无法找到有关此操作的任何信息。是否有开箱即用的机制?如果是这样,这是否暴露于QtScript? (如果没有,我可以很容易地包装它。)

如果没有这样的机制,最好的添加方法是什么?我无法在简单的钩子之外操纵现有的应用程序,但我可以自己挂钩QObject :: connect并存储连接,只是不确定这是否是最好的方法。

3 个答案:

答案 0 :(得分:28)

我认为Qt存储了给定信号所连接的插槽,因此当您发出它时,所有接收器都被调用,因此您可以访问接收器列表:

出于调试目的,您有:

  

void QObject :: dumpObjectInfo()

     

转储有关信号的信息   这个对象的连接等   调试输出。

     

此功能对调试很有用,   但如果图书馆有什么,什么都不做   已在发布模式下编译(即   没有调试信息)。

信号连接的插槽列表:

  

int QObject :: receivers(const char *   信号)const [protected]

     

返回接收者的数量   连接到信号。

metaObject()为您提供了插槽的QMetaMethod,但它没有关于其连接的信息。

但是,如果您知道对象,则可以遍历所有信号(使用元对象,测试信号的方法类型)并使用接收器()给出的插槽构建反向索引。

答案 1 :(得分:9)

如果不保留Qt的内部互斥锁/信号量,就无法安全地迭代信号槽连接列表。信号和插槽可以随时进出,所以最多只能获得一个无法保证正确的列表 - 因此无用。

无论你在QObject::connect做什么钩子本身都不够。从这种钩子中获得的数据将受到以下影响:

  1. 您可能有指向在您尝试访问时已删除的对象的指针。您可以使用QPointer来缓解此问题,但这仅适用于运行代码的线程中的对象。您需要将对象注入其他线程以收集对象列表。

  2. 您可能已经存在不再存在的联系。即使挂钩QObject::disconnect也不够,因为当对象不再存在时删除连接。

  3. 您面临的问题非常复杂,任何强大的解决方案都不仅限于“挂钩”。 QObject::connect

    唉,你还没有说为什么你需要附加到插槽的信号列表。它的目的是什么?

答案 2 :(得分:3)

在Qt代码库和文档中挖掘后(我从这里和其他地方得到了很多有用的提示),我最终决定挂钩QObject :: connect(静态重载)。为什么?那么,其他解决方案要求您知道哪些对象提供信号,挖掘私有字段,或者必须具有Qt的调试版本。最后,挂钩QObject :: connect为您提供应用程序中连接的所有内容,您可以轻松地映射回插槽。