确定连接到Qt中给定插槽的信号
我已经将自己注入到一个Qt应用程序中,我试图找出一个给定插槽连接到什么信号,但找不到任何关于这样做的信息。有没有一种机制可以开箱即用?如果是,这是否暴露给QtScript?(如果没有,我可以很容易地包装它。)确定连接到Qt中给定插槽的信号,qt,signals-slots,Qt,Signals Slots,我已经将自己注入到一个Qt应用程序中,我试图找出一个给定插槽连接到什么信号,但找不到任何关于这样做的信息。有没有一种机制可以开箱即用?如果是,这是否暴露给QtScript?(如果没有,我可以很容易地包装它。) 如果没有这样的机制,最好的办法是什么?除了简单的挂接之外,我无法操作现有的应用程序,但我可以自己挂接QObject::connect并存储连接,只是不确定这是否是最好的方法。我认为Qt存储给定信号连接到的插槽,因此当您发出它时,所有接收器都被调用,因此,您可以访问接收器列表: 出于调试目的
如果没有这样的机制,最好的办法是什么?除了简单的挂接之外,我无法操作现有的应用程序,但我可以自己挂接QObject::connect并存储连接,只是不确定这是否是最好的方法。我认为Qt存储给定信号连接到的插槽,因此当您发出它时,所有接收器都被调用,因此,您可以访问接收器列表: 出于调试目的,您有: void QObject::dumpObjectInfo() 转储有关信号的信息 此对象的连接等 调试输出 此函数对于调试非常有用, 但如果图书馆有 已在发布模式下编译(即。 没有调试信息) 以及连接信号的插槽列表: int QObject::接收器(常量字符* 信号)常数[受保护] 返回接收器的数量 连接到信号 metaObject()为您提供插槽的QMetaMethod,但它没有关于其连接的信息
然而,如果你知道对象,你可以检查所有的信号(使用元对象,测试信号的方法类型),并用slots receivers()给你建立一个反向索引。在Qt代码库和文档中挖掘之后(我从这里和其他地方得到了很多有用的提示),我最终决定钩住QObject::connect(静态重载)。为什么?其他解决方案要求您知道哪些对象提供信号,深入研究私有字段,或者必须对Qt进行调试构建。最后,钩住QObject::connect将为您提供应用程序中连接的所有内容,您可以轻松地映射回插槽。如果不保持Qt的内部互斥体/信号量,就无法安全地迭代信号插槽连接列表。信号和插槽可以在任何时候来来去去去,所以充其量你只能得到一个不能保证正确的列表——因此毫无用处 您在
QObject::connect
中执行的任何挂钩本身都是不够的。从这些挂钩中获得的数据将受到以下影响:
QPointer
来缓解这一问题,但这只适用于运行代码的线程中的对象。您需要将对象注入到其他线程中,以便在那里收集对象列表QObject::disconnect
也不够,因为当对象不再存在时,连接会被删除QObject::connect
唉,您还没有说明为什么需要附加到插槽的信号列表。它的目的是什么?谢谢你提供的信息。在不知道对象的情况下,是否有任何工具可以执行此操作?这正是我目前遇到的问题。