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