我想从qml访问QList。 这是一个示例代码
class A;
class B : public QObject {
...
Q_INVOKABLE QQmlListProperty<A> read();
...
private:
QList<A*> lst;
}
我使用context属性来访问qml中B类的对象。 如何在qml中访问列表。任何示例代码都会有所帮助。
答案 0 :(得分:3)
您需要Q_DECLARE_METATYPE(A *)
才能将其打包在QVariant
中以便在QML中使用。
但这仅仅是为了引用并传递给QML。
如果你想在QML中使用A
,就像在C ++中一样,它必须继承QObject
并实现属性,插槽等。
您可以在此处查看如何实施QQmlListProperty
:http://doc.qt.io/qt-5/qtqml-referenceexamples-properties-example.html
另外,如果QObject
对你来说太沉重而且很多东西都不实用,那么你总是可以使用一个QObject
派生来作为非QObject
的控制器。但仍然注册为元类型类型。
class A {
public:
int a;
};
Q_DECLARE_METATYPE(A *)
class AProxy : public QObject {
Q_OBJECT
public slots:
int a(QVariant aVar) {
return aVar.value<A *>()->a;
}
void setA(QVariant aVar, int v) {
aVar.value<A *>()->a = v;
}
};
这样,对于列表中的每个对象,您都没有QObject
的大小开销和限制,而是可以使用单个控制器来访问数据,尽管性能较低。在您的情况下,您可以使用B
充当A
的容器和控制器代理。