C ++对象属性的QML属性

时间:2013-10-15 00:30:29

标签: c++ qt qml

我是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)。在示例中,toStringQ_INVOKABLE,非工作案例中的频率会返回QObject派生的CFrequency对象的副本。

- 编辑:进一步的调查结果 -

当我更改频率属性以返回CFrequency*而不是CFrequency时,它也不起作用。当我得到TypeError: Cannot call method 'toQString' of undefined时,情况似乎是一样的。仅CFrequency有效,但QML不理解myatcstation.frequency是具有toString的频率对象。

2 个答案:

答案 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