【问题标题】:Determine signals connected to a given slot in Qt确定连接到 Qt 中给定插槽的信号
【发布时间】:2011-02-14 21:20:47
【问题描述】:

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

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

【问题讨论】:

    标签: qt signals-slots


    【解决方案1】:

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

    出于调试目的,您有:

    void QObject::dumpObjectInfo ()

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

    这个函数对调试很有用, 但如果图书馆有 在发布模式下编译(即 没有调试信息)。

    和一个信号连接的槽列表:

    int QObject::receivers ( const char * 信号 ) const [受保护]

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

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

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

    【讨论】:

    • 感谢您的信息。是否有任何设施可以在不知道对象的情况下执行此操作?这确实是我目前遇到的问题。
    【解决方案2】:

    如果不保存 Qt 的内部互斥体/信号量,就无法安全地迭代信号槽连接列表。信号和槽可以随时来来去去,所以充其量你会得到一个不能保证正确的列表 - 因此无用。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 2015-03-14
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        相关资源
        最近更新 更多