从qml </t>访问QList <t>

时间:2015-03-16 17:20:47

标签: c++ qt qml

我想从qml访问QList。 这是一个示例代码

class A;
class B : public QObject {
   ...
   Q_INVOKABLE QQmlListProperty<A> read();
   ...
private:
   QList<A*> lst;
}

我使用context属性来访问qml中B类的对象。 如何在qml中访问列表。任何示例代码都会有所帮助。

1 个答案:

答案 0 :(得分:3)

您需要Q_DECLARE_METATYPE(A *)才能将其打包在QVariant中以便在QML中使用。

但这仅仅是为了引用并传递给QML。

如果你想在QML中使用A,就像在C ++中一样,它必须继承QObject并实现属性,插槽等。

您可以在此处查看如何实施QQmlListPropertyhttp://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的容器和控制器代理。