3

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

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

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

Text
{
 text: myserviceinterface.stldata
}

Unable to assign std::string to QString在附加现有 QML 字符串时产生警告语句:

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

使Text控件显示怪异QVariant(std::string)

我究竟做错了什么?

4

1 回答 1

5

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

一般来说,您只能将两种 C++ 类型导出到 QML:QObject 派生类和一些内置值类型,请参阅此文档页面。因此,仅使用 aQString作为 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值类型等的支持。

于 2013-06-20T19:39:47.257 回答