我是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] has no method 'toQString'
frequency
是类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: Cannot call method 'toQString' of undefined
时,情况似乎是一样的。仅CFrequency
有效,但QML不理解myatcstation.frequency
是具有toString
的频率对象。
答案 0 :(得分:1)
CFrequency
不是我假设的QObject,否则你不会按值而是通过指针返回它。要使`QQtring()可以从QML调用,它必须是Q_INVOKABLE或一个槽,这意味着CFrequency也必须是一个QObject。
如果电台只有一个频率,请考虑将相关信息移动到电台对象中,即将您需要的频率信息作为属性添加到CStation。
要在频率发生变化时获取更新,请考虑使用Q_PROPERTY(QString frequencyAsString READ frequencyAsString NOTIFY frequencyAsStringChanged)
等属性代替toQString()
。属性具有通过属性绑定“内置”的更新机制,而没有好的方法告诉QML它应该再次调用QString,因为频率已经改变。
答案 1 :(得分:1)
我解决了类似的问题:
class TopObject : public QObject
{
Q_OBJECT
Q_PROPERTY(ValueObject* theValue ...
...
}
class ValueObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString value ...
...
}
在主要申请中:
qRegisterMetaType<ValueObject>("ValueObject");
qmlRegisterType<ValueObject>("com.name.comp", 1, 0, "ValueObject");
...->setContextProperty("topObject", new TopObject());
在qml代码中:
import com.name.comp 1.0
... {
text: topObject.theValue.value
...
它需要两者,将属性(ValueObject)作为指针返回并使用qmlRegisterType注册它。
另见Exchange Data and Objects between C++ and QML and vice versa