我是 QML 新手,在访问 C++ 对象的 property.property 时遇到问题:
C++、frequency 和 station 都是 Qt 元类型注册对象:
CStation *station = new CStation(...); // QObject
CFrequency *frequency = new CFrequency(..); // QObject
QQmlContext *qmlContext = viewer.rootContext();
qmlContext->setContextProperty("myatcstation", station);
qmlContext->setContextProperty("myfrequency", frequency);
QML:
RowLayout { ....
TextField {
text: myatcstation.toQString(true)
}
}
.... text: myfrequency.toQString(true)
这行得通,但是当我写的时候:text: myatcstation.frequency.toQString(true)
我确实得到了TypeError: Object [object Object] has no method 'toQString'
frequency
是类CStation
集的属性Q_PROPERTY(CFrequency frequency READ getFrequency)
C++ 中的交叉检查有效:
CFrequency test = station->property("frequency").value<CFrequency>();
-- 编辑:弗兰克的回答 --
这两个类都派生自QObject
,它不像教科书那样是可复制的。我知道身份与价值的情况。
基本上频率是一个值对象,但我已经将它QObject
作为基础,因此我可以使用它的属性(请参阅Any chance to use non QObject classes with QML)。在示例中,toString
is Q_INVOKABLE
,频率在非工作情况下返回QObject
派生CFrequency
对象的副本。
-- 编辑:进一步的发现 --
当我将频率属性更改为返回CFrequency*
而不是CFrequency
它时,它也不起作用。据我所知TypeError: Cannot call method 'toQString' of undefined
,情况似乎是一样的。CFrequency
单独工作,但 QML 不明白这myatcstation.frequency
是一个具有toString
.