Repeater中的QML ListView

时间:2015-04-01 07:52:57

标签: c++ qt listview qml repeater

如何为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,并且无法找到解决方案。

2 个答案:

答案 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
// ...