我是QML的新手,在访问C对象的property.property时遇到问题:
C,频率和站都是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]没有方法’toQString’
频率是CStation类的属性设置为Q_PROPERTY(CFrequency frequency READ getFrequency)
C中的Crosscheck工作:
CFrequency test = station->property("frequency").value<CFrequency>();
– 编辑:弗兰克的回答 –
这两个类都是从QObject派生出来的,并不是因为教科书是可复制的.我知道Identity vs value的情况.
基本上频率是一个值对象,但我已经使它基于QObject,所以我可以使用它的属性(见Any chance to use non QObject classes with QML).在示例中,toString是Q_INVOKABLE,非工作情况下的频率返回QObject派生的CFrequency对象的副本.
– 编辑:进一步调查结果 –
当我更改频率属性以返回CFrequency *而不是CFrequency时,它也不起作用.因为我得到TypeError:无法调用未定义的方法’toQString’,情况似乎是一样的.单独的CFrequency工作,但QML不明白myatcstation.frequency是一个频率对象,它有toString.
最佳答案 CFrequency不是我假设的QObject,否则你不会按值而是通过指针返回它.要使`QQtring()可以从QML调用,它必须是Q_INVOKABLE或槽,这意味着CFrequency也必须是QObject.
如果电台只有一个频率,请考虑将相关信息移动到电台对象中,即将您需要的频率信息作为属性添加到CStation.
要在频率更改时获取更新,请考虑使用诸如Q_PROPERTY(QString frequencyAsString READ frequencyAsString NOTIFY frequencyAsStringChanged)之类的属性而不是toQString().属性具有通过属性绑定“内置”的更新机制,而没有好的方法告诉QML它应该再次调用QString,因为频率已经改变.