Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定连接到Qt中给定插槽的信号_Qt_Signals Slots - Fatal编程技术网

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

确定连接到Qt中给定插槽的信号,qt,signals-slots,Qt,Signals Slots,我已经将自己注入到一个Qt应用程序中,我试图找出一个给定插槽连接到什么信号,但找不到任何关于这样做的信息。有没有一种机制可以开箱即用?如果是,这是否暴露给QtScript?(如果没有,我可以很容易地包装它。) 如果没有这样的机制,最好的办法是什么?除了简单的挂接之外,我无法操作现有的应用程序,但我可以自己挂接QObject::connect并存储连接,只是不确定这是否是最好的方法。我认为Qt存储给定信号连接到的插槽,因此当您发出它时,所有接收器都被调用,因此,您可以访问接收器列表: 出于调试目的

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


如果没有这样的机制,最好的办法是什么?除了简单的挂接之外,我无法操作现有的应用程序,但我可以自己挂接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


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

    谢谢你提供的信息。在不知道对象的情况下,是否有任何工具可以执行此操作?这正是我目前遇到的问题。