如何在QObject :: connect中使用QMetaMethod

Ves*_*niK 7 c++ qt qt4

我有两个QObject子类实例和两个QMetaMethod信号实例,其中一个对象和另一个对象中的插槽.我想把这个信号和插槽相互连接起来.

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

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

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

小智 15

从Qt 4.8.0开始修复了这个问题:

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

假设我们有一个QObject*m_subject,并希望将属性的change-notification信号连接到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);
}
Run Code Online (Sandbox Code Playgroud)

我成功地使用它来创建一个QWidget子类,它查找任何QObject的所有属性,并为每个QObject创建一个QLineEdit,并通过连接在相应的属性更改时保持QLineEdit更新.(因为我没有找到一个方法来传递一个属性ID值的PropertyChanged()虽然,有必要使QLineEdit的子类和实施的PropertyChanged()那里.QSignalMapper没有帮助,因为所有属性都在同宾语.)

  • 是的,它是由我自己发送给Qt的补丁修复的:) (3认同)

cha*_*lup 1

看起来不依赖内部实现是没有办法让它工作的。如果我是你,我会向Qt bug tracker提交功能请求,编写模仿当前行为 SIGNAL/SLOT 宏的代码,并添加单元测试,该测试在 SIGNAL/SLOT 行为更改时会失败。

对于您想要解决的问题,可能有一个更简单的解决方案:描述您到底想要做什么,而不需要任何实现细节。