我想知道是否可以在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中不明显,这意味着它看起来应该像可以用方括号运算符访问的普通数组。事实上,它实际上是只是包装纸应该对用户完全透明。
答案 0 :(得分:0)
您可以将数组包装在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) }
}