如何将 QMetaMethod 与 QObject::connect 一起使用

2023-11-26

我有两个 QObject 子类实例和一个对象中信号的两个 QMetaMethod 实例以及另一个对象中插槽的两个实例。我想将这个信号和插槽相互连接。

我查看了 qobject.h 文件,发现 SIGNAL() 和 SLOT() 宏只是在方法签名的开头添加“1”或“2”字符,因此看起来应该可以添加相同的字符字符到 QMetaMethod::signature() 返回的字符串的开头,但这种方法取决于工具包的一些未记录的内部结构,并且可能随时被新版本的 Qt 破坏。

有谁知道通过 QMetaMethod 反射表示连接信号和槽的可靠方法?

Edited:我在 Qt 问题跟踪器中创建了建议:https://bugreports.qt.io/browse/QTBUG-10637如果有人也对此功能感兴趣,您可以在那里为这张票投票。


自 Qt 4.8.0 起此问题已得到修复:

https://bugreports.qt.io/browse/QTBUG-10637

假设我们有一个 QObject* m_subject,并希望将属性的更改通知信号连接到 propertyChanged() 槽:

const QMetaObject* meta = m_subject->metaObject();
QMetaProperty prop = meta->property(meta->indexOfProperty("myProperty"));
if (prop.hasNotifySignal()) {
    QMetaMethod signal = prop.notifySignal();
    QMetaMethod updateSlot = metaObject()->method(
        metaObject()->indexOfSlot("propertyChanged()"));
    connect(m_subject, signal, this, updateSlot);
}

我成功地使用它创建了一个 QWidget 子类,它查找任何 QObject 的所有属性并为每个属性创建一个 QLineEdit,并通过一个连接在相应的属性更改时保持 QLineEdit 更新。 (因为我没有找到将 propertyID 值传递给 propertyChanged() 的方法,所以有必要创建 QLineEdit 的子类并在那里实现 propertyChanged() 。QSignalMapper 没有帮助,因为所有属性都在同一个中目的。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 QMetaMethod 与 QObject::connect 一起使用 的相关文章

随机推荐