2013-06-20 113 views
1

我有一個需要在QtQuick 2.0應用程序(圖形界面)和純粹的STL應用程序(服務器)之間共享的STL代碼庫。該接口可以從共享的STL代碼庫派生它的類,因此它可以具有信號,插槽等,但是共享數據結構需要保持僅STL。在QML中使用std :: string

我想避免數據的重複(std::string - >QString等),使我試圖直接Q_PROPERTY系統內使用std::string。使用Q_DECLARE_METATYPE(std::string)qRegisterMetaType<std::string>();,並宣佈類似性質:

Q_PROPERTY(QString stldata READ stldata WRITE setSTLData NOTIFY stldataChanged) 

讓我的代碼編譯,但仍然QML不喜歡std::string秒。

寫入一個文本字段:

Text 
{ 
text: myserviceinterface.stldata 
} 

產生警告說Unable to assign std::string to QString,而追加現有的QML字符串:

Text 
{ 
text: "text: " + myserviceinterface.stldata 
} 

使得Text控制顯示一個奇怪的QVariant(std::string)

我在做什麼錯?

回答

5

恐怕你不能在QML中直接使用std::string,你必須先轉換爲QString

通常,只能將兩種C++類型導出到QML:QObject派生類和一些內置值類型,請參見this documentation page。因此,使用QString作爲Q_PROPERTY的類型僅適用,因爲它在QML引擎中具有特殊的內置支持。沒有辦法增加對更多這些值類型的支持,如std::string(*)。

使用qRegisterMetaType也沒有幫助:它只是將std::string註冊爲元類型,其中其他意味着它可以存儲在QVariant中。它(大部分)與QML集成無關。

因此,有你的getter返回一個QString

Q_PROPERTY(QString stldata READ stldata WRITE setSTLData NOTIFY stldataChanged) 
    QString stldata() const { 
     return QString::fromStdString(myStlString); 
    } 

(*)其實有添加新的值類型支持的方式,但是這是在QML私有API需要直接與基礎工作Javascript引擎。 QtQuick模塊使用該私有API來添加對例如值類型爲QMatrix4x4

+0

你說得對,我放棄了。然而,擁有已經可用的'std :: string'的'QString'副本並不是理想的解決方案。這意味着從已經受限的移動設備中消耗更多的內存,更新兩個字符串時的更多計算等等。 – Avio

+0

對不起,你沒有提到'std :: string'的另一個'QString'副本作爲成員變量,我只是想到了它。好吧,我想我可以在每次界面需要顯示變量時轉換它。 – Avio

相關問題