如何将不同的模型分配给Repeater
内部的ListView
?我做了一个草图(我的实际项目要大得多):
Column {
Repeater {
model: ["Line1","Line2","Line3","Line4"]
Rectangle {
ListView {
model: ???
delegate: Rectangle {
Text {
text: somemodelproperty
}
}
}
}
}
}
目前,我通过复制粘贴10个矩形来解决这个问题,每个矩形包含一个ListView
。在C++中,我已经实现了10个QList<QObject*>
,每个列表都“绑定”到一个ListView
,方法是:
QQmlContext * example = engine.rootContext();
example->setContextProperty(modelname,QVariant::fromValue(listobject));
我非常肯定有一种更智能的方法来实现这一点,但是我几天前才开始使用QML,还没有找到解决方案。
3条答案
按热度按时间z9gpfhce1#
这里有一个问题,你不能使用
id
作为列表元素的值,也不能在列表元素中嵌套列表模型,至少不能直接嵌套。但是,您可以按如下方式填充它:
或者,如果您更喜欢使用C++数据,则可以向列表中的每个元素添加
QObject*
“model”属性,并使用函数对其进行设置,如上面的示例所示,或者使用您指定的内部模型的id
。再考虑一下,您可能希望使用另一个名称而不是“model”,因为我无法想象QML会对
model: model
这样的东西感到高兴更新:您可以尝试这样做(假设您的10个模型在QML中公开为
m1
-m10
)然后,对于repeater委托中的
ListView
,您可以:然后假设repeater中有10个元素,每个列表视图的模型将从具有适当元素索引的数组中选择。
f4t66c6m2#
声明repeater的模型,而不是使用字符串数组。您可以使用ListModel来实现此目的。您还可以向ListModels元素ListElement添加所需的任何属性。声明如下内容:
然后将其分配给Repeater的模型属性
然后,您只需调用model的model属性,就可以访问ListView的model,如下所示(假设您已经为Repeater元素分配了id“repeater”):
型
1cklez4t3#
对于该模型,考虑一个嵌套了子数组的数组。由于外部
Repeater
和内部ListView
具有不同的modelData
示例,因此要进行区分,请考虑将外部modelData
复制到名为outerModelData
的属性。在下面的示例中,我重构出
Column
-Repeater
-ListView
,并将其替换为ListView
-ListView
。这两种模式实现了相同的功能,但后者的实现时间更短。你可以Try it Online!