QML自定义列表数据类型

QML Custom List Data type

本文关键字:数据类型 列表 自定义 QML      更新时间:2023-10-16

我想知道是否可以在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
}

我正在寻找一种包装数组的方法只有包装器应完全透明用户。

您可以将数组包装在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) }
}