C++ 访问QList<;T>;来自qml

C++ 访问QList<;T>;来自qml,c++,qt,qml,C++,Qt,Qml,我想从qml访问QList。 下面是一个示例代码 class A; class B : public QObject { ... Q_INVOKABLE QQmlListProperty<A> read(); ... private: QList<A*> lst; } A类; B类:公共质量对象{ ... Q_可调用的qqmlistproperty read(); ... 私人: QList-lst; } 我正在使用上下文属性访问qml中类B的

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

class A;
class B : public QObject {
   ...
   Q_INVOKABLE QQmlListProperty<A> read();
   ...
private:
   QList<A*> lst;
}
A类;
B类:公共质量对象{
...
Q_可调用的qqmlistproperty read();
...
私人:
QList-lst;
}
我正在使用上下文属性访问qml中类B的对象。
如何访问qml中的列表。任何示例代码都会很有帮助

您需要
Q\u DECLARE\u元类型(A*)
才能将其包装在
QVariant
中,以便在QML中使用

但这只是为了引用和传递QML

如果您想在QML中使用<代码> A<代码> C++,则必须继承<代码> QObjult<代码>,实现属性、时隙等。

您可以在这里看到如何实现
qqmlistproperty

此外,如果
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;
  }
};
A类{
公众:
INTA;
};
Q_DECLARE_元类型(A*)
AProxy类:公共QoObject{
Q_对象
公众时段:
内部a(Qavar变体){
返回aVar.value()->a;
}
无效setA(qavar,int v){
平均值()->a=v;
}
};

这样,您就不必为列表中的每个对象设置
QObject
的大小开销和限制,而是可以使用单个控制器访问数据,尽管性能较低。在您的例子中,您可以使用
B
作为
A
的容器和控制器代理,这可能是重复的:我明白了您的意思,但仍然感到困惑。如何实现
qqmlistperty
?我是否在qml中使用
属性变量lst:b.read()
。从Qt文档中看,他们似乎在从qml中附加列表,但我想从qml中读取列表。@Ansh-你们做到了吗?我看你接受了答案。该文档实际上非常详细地介绍了如何实现它-如果您想从QML使用它,只需将AppendFunction、CountFunction、AtFunction和ClearFunction声明为插槽或
Q_INVOKABLE
:实际上我能够按照您的建议实现控制器函数,这就是我接受答案的原因。但是文档与
qqmlistproperty
相混淆。让我解释一下我在哪里感到困惑。我正在使用
read()
函数将
QList
转换为
qqmlistproperty
,因此在qml中,我应该在这样的函数中使用它
var lst=b.read()(其中
b
是设置为上下文属性的b类对象)。但是我认为var不能处理
qqmlistproperty