【问题标题】:Qt Get signal-slot connection information from a widgetQt 从小部件获取信号槽连接信息
【发布时间】:2011-10-12 11:55:00
【问题描述】:

我觉得当前的 API 无法做到这一点,但我不得不问一下。是否可以查询特定 QObject 的信号或插槽名称(来自元对象)并检索所有 QObject 及其与其连接的插槽或信号名称?

我这样做是因为,实际上,我有大量包含相同排列的小部件的布局,每个布局都有一个对象,并且每个布局的小部件控制它的各种属性。我想保留一个布局,并将其小部件的信号/插槽以相同模式连接到所有其他对象,但为了做到这一点,我需要“记录”所有信号插槽数据。

有可能吗?

【问题讨论】:

  • 听起来像是解决很多头痛问题的捷径。您是否考虑过将所有必要的连接语句移到一个函数中?
  • 没那么简单。我有一个“属性”面板,它显示选定对象的属性,每个对象都在一个继承链中,并且链中的每个类在布局中为类管理的属性提供一个 UI(以及适当的连接)。这些布局链接在一起以生成放入属性面板的最终布局。
  • 但是,如果选择了多个不同类型的对象,它们之间的共同属性将被挑选出来并组装到一个布局中。到目前为止,如此实施。但是每个对象都有自己的信号槽连接,这些需要移动到新创建的布局中,所以我有一个控制多个对象的布局。这需要我查询和记录对象的信号槽连接。

标签: qt signals-slots


【解决方案1】:

Qt 中有一个有趣的文件-%Qtdir%/src/corelib/kernel/qobject_p.h,它包含类QObjectPrivate,由Qt 内部使用。 采用 static QObjectPrivate *get(QObject *o) 函数为您的小部件获取 QObjectPrivate 成员,并尝试调用其有趣的成员,例如 QObjectList receiverList(const char *signal) const;QObjectList senderList() const;。文件完全没有记录,但它似乎包含您需要的内容...

【讨论】:

  • 很好的调查,但我看不出如何使用它,因为它是一个私有类(Qt 几乎所有类都使用 PIMPL),所以我必须将源代码复制到我的项目无疑会引发许可问题。
  • 提出了一个问题:他们为什么不将该功能包含到公共 API 中?很有用!
  • 真的,这个类不是私有的,它只是无证的。它被声明为class Q_CORE_EXPORT QObjectPrivate : public QObjectData - 所以你不需要复制任何源代码,它是从 QtCore dll 导出的
  • 此外,如果您害怕警告“该文件可能会在没有通知的情况下更改”,那么关于 qt 的另一个事实 - 他们的库与以前的版本是二进制兼容的。这意味着在 qt5 到来之前不会删除任何导出的函数和类。
  • 只有补丁版本是二进制向前和向后兼容的,次要版本只是向后二进制兼容的。所以从 Qt 4.6 切换到 4.7 可能会破坏您的软件。但是从 4.​​6.3 切换到 4.6.4 不会
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2016-11-10
相关资源
最近更新 更多