我有两个 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(使用前将#替换为@)