【问题标题】:Using std::string in QML在 QML 中使用 std::string
【发布时间】:2013-06-17 11:40:06
【问题描述】:

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

我想避免数据重复(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::strings。

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

Text
{
 text: myserviceinterface.stldata
}

产生一个警告说Unable to assign std::string to QString,同时附加一个现有的QML字符串:

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

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

我做错了什么?

【问题讨论】:

    标签: c++ qt qml stdstring qstring


    【解决方案1】:

    恐怕你不能直接在QML中使用std::string,你必须先转换成QString

    一般来说,您只能将两种 C++ 类型导出到 QML:QObject 派生类和一些内置值类型,请参阅this documentation page。因此,使用QString 作为 Q_PROPERTY 的类型只能起作用,因为它在 QML 引擎中具有特殊的内置支持。无法添加对更多这些值类型的支持,例如std::string (*)。

    使用qRegisterMetaType 也无济于事:它只是将std::string 注册为元类型,这意味着它可以存储在QVariant 中。它(大部分)与 QML 集成无关。

    所以让你的吸气剂返回一个QString

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

    (*) 实际上有一种方法可以添加对新值类型的支持,但这是 QML 中的私有 API,需要直接与底层 Javascript 引擎一起工作。 QtQuick 模块使用该私有 API 来添加对例如的支持。 QMatrix4x4 值类型。

    【讨论】:

    • 你说得对,我放弃了。然而,拥有一个已经可用的std::stringQString 副本并不是理想的解决方案。这意味着从已经受限的移动设备中消耗更多的内存,更新字符串时需要更多的计算等等。
    • 对不起,你没有提到std::string 的另一个QString 副本作为成员变量,我只是想象了一下。好吧,我想每次界面需要显示变量的时候我都可以转换一下。
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2011-03-26
    • 2016-08-22
    • 2010-12-04
    • 2013-03-27
    相关资源
    最近更新 更多