4

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

-- 编辑:进一步的发现 --

当我将频率属性更改为返回CFrequency*而不是CFrequency它时,它也不起作用。据我所知TypeError: Cannot call method 'toQString' of undefined,情况似乎是一样的。CFrequency单独工作,但 QML 不明白这myatcstation.frequency是一个具有toString.

4

2 回答 2

1

CFrequency不是我假设的 QObject ,否则您不会按值返回它,而是按指针返回。要使 `toQString() 可从 QML 调用,它必须是 Q_INVOKABLE 或插槽,这意味着 CFrequency 也必须是 QObject。

如果一个电台只有一个频率,请考虑将相关信息移动到电台对象中,即将您需要的频率信息作为属性添加到 CStation。

要在频率更改时获取更新,请考虑使用诸如Q_PROPERTY(QString frequencyAsString READ frequencyAsString NOTIFY frequencyAsStringChanged)代替的属性toQString()。属性具有通过属性绑定“内置”的更新机制,而没有好的方法告诉 QML 它应该再次调用 toQString,因为频率发生了变化。

于 2013-10-15T06:25:56.213 回答
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。

另请参阅在 C++ 和 QML 之间交换数据和对象,反之亦然

于 2016-01-27T10:03:44.377 回答