2013-06-20 77 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

相关问题