在QML中使用std :: string

时间:2013-06-20 14:41:16

标签: c++ qt qml stdstring qstring

我有一个STL代码库需要在QtQuick 2.0应用程序(图形界面)和纯粹的STL应用程序(服务器)之间共享。接口可以从共享的STL代码库派生它的类,因此它可以有Q_PROPERTY个,信号,插槽等,但共享数据结构需要保持仅STL。

我想避免数据重复(std::string - &gt; QString等),所以我尝试在std::string系统中直接使用Q_PROPERTY。使用Q_DECLARE_METATYPE(std::string)qRegisterMetaType<std::string>();并声明属性,如:

Q_PROPERTY(QString stldata READ stldata WRITE setSTLData NOTIFY stldataChanged)

使我的代码编译,但QML仍然不喜欢std::string s。

用以下内容编写文本字段:

Text
{
 text: myserviceinterface.stldata
}

发出警告Unable to assign std::string to QString,同时追加现有的QML字符串:

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

使Text控件显示为奇怪的QVariant(std::string)

我做错了什么?

1 个答案:

答案 0 :(得分: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值类型。