繁体   English   中英

QML自定义列表数据类型

[英]QML Custom List Data type

我想知道在QML中是否可以定义可以在QML中使用的自定义列表类。

目前,我正在解析或多或少复杂的数据结构,并将它们转换为QVariantMap,QVariantList和QVariants的树。
但是,这些类型可能包括大多数基本类型的数组(uint8_t,uint16_t,...,uint64_t,int8_t,...,float,double)。
如果由于显而易见的性能原因我不必将这些数组复制到QVariantList中,我更喜欢它。
有没有什么方法可以将数组包装在一个自定义类型中,以QML理解的方式提供项访问,因此只在请求时将元素复制到QVariant?

我已经尝试使用Q_INVOKABLE operator[]注册一个类型,但这似乎不起作用。

更新:澄清一点。 我知道我可以使用可以提供访问器方法的自定义属性创建一个类。 但是,使用QVariantList方法,我可以在QML中执行以下操作

onMessage: {
  element.text = message.poses[0].position.x
}

我正在寻找一种方法来包装数组,使得实际的实现在QML中不明显,这意味着,它应该看起来像一个普通的数组,可以使用括号运算符等进行访问。事实上它实际上只是一个包装器应该对用户完全透明。

您可以将数组包装在QObject ,并将其作为上下文属性传递给QML部件。

例如,要在QML中使用整数向量:

class ArrayInterface: public QObject
{
    Q_OBJECT
    using value_t = int;
public:
    ArrayInterface(std::vector<value_t> const& src): QObject(), source(src)
    {}
    // Can be called from QML
    Q_INVOKABLE int get(int idx) const
    {
        return source[idx];
    }
private:
    std::vector<value_t> const& source;
};
int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    std::vector<int> vec = {12, 4, 5, 7};
    ArrayInterface data(vec);

    QQuickView view;
    view.rootContext()->setContextProperty("myArray", &data);
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();

    return app.exec();
}
Item {
    height: 500
    width: 500
    Text { text: myArray.get(0) }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM