如何为ListView
内的Repeater
分配不同的模型?
我做了一个草图(我的实际项目要大得多):
Column {
Repeater {
model: ["Line1","Line2","Line3","Line4"]
Rectangle {
ListView {
model: ???
delegate: Rectangle {
Text {
text: somemodelproperty
}
}
}
}
}
}
目前,我正在通过复制粘贴10个矩形来解决这个想法,每个矩形包含一个ListView
。在C ++中,我实现了10 QList<QObject*>
,每个列表都是&#34;有界&#34;通过
ListView
QQmlContext * example = engine.rootContext();
example->setContextProperty(modelname,QVariant::fromValue(listobject));
我很确定有一种更聪明的方法可以做到这一点,但我几天前刚开始使用QML,并且无法找到解决方案。
答案 0 :(得分:2)
有一个问题,您不能使用id
作为列表元素的值,也不能将列表模型嵌套在列表元素中,至少不能直接嵌套。
然而,您可以像这样填充它:
Item {
id: models
ListModel {/*...*/}
ListModel {/*...*/}
//...
}
ListModel {
id: outerModel
}
function set() {
for (var i = 0; i < models.data.length; ++i) {
outerModel.append({"model": models.data[i] /* and other stuff */})
}
}
或者,如果您更喜欢使用C ++数据,则可以添加QObject*
&#34;模型&#34;属性到列表中的每个元素,并使用函数进行设置,如上例所示,或者为您指定的内部模型使用id
。
再想一想,您可能想要使用其他名称而不是&#34; model&#34;因为我无法想象QML会对像model: model
更新:您可以尝试这样做(假设您的10个模型在QML中显示为m1
- m10
)
property var subModels: [m1, m2, ... m10]
然后,对于转发器代表中的ListView
,您可以:
ListView {
model: subModels[index]
// ...
}
然后假设转发器中有10个元素,将从具有相应元素索引的数组中选择每个列表视图的模型。
答案 1 :(得分:1)
声明转发器的模型而不是使用字符串数组。您可以将ListModel用于此目的。您还可以添加ListModels元素,ListElement,您想要的任何属性。声明如下内容:
ListModel {
id: repeaterModel
ListElement { title: "Line1"; model: modelForFirstElement; }
ListElement { title: "Line2"; model: modelForSecondElement; }
// ...
}
然后将其分配给Repeater的模型属性
Repeater {
id: repeater
model: repeaterModel
// ...
然后你可以通过调用模型的模型属性来访问ListView的模型,就像这样(假设你为你的Repeater元素指定了id&#34; repeater&#34;): / p>
ListView {
model: repeater.model.model
// ...