2013-10-15 147 views
4

我相信新的QML和在访问℃的property.property有问题++对象:QML属性++对象

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财产++作品:

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

回答

1

CFrequency不是一个QObject我假设,否则你就不是价值,而是由指针返回。为了使`toQString()可以从QML调用,它必须是Q_INVOKABLE或一个插槽,这意味着CFrequency也必须是QObject。

如果一个站只有一个频率,考虑将相关信息录入电台对象,即添加你需要的属性CStation的频率信息。

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

+0

好提示,在上面添加了一些信息。问题是,如果CFrequency(它是一个按值返回的QObject)作为副本返回(即使它不需要复制QObject),它是否应该工作。 –

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