2013-10-15 148 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