从DelegateModel创建QML项目

时间:2017-02-21 10:50:56

标签: qt qml

是否可以从DelegateModel创建QML项目?

以下是DelegateModel的示例:

DelegateModel
 {
    id: delegateModel
    model: ListModel
    {
        ListElement { name: "#FAFAFA"; test: "object1" }
        ListElement { name: "#000000"; test: "object2" }
    }
    delegate: Rectangle
    {
        objectName: test
        width: 50
        height: 50
        color: name
    }
    Component.onCompleted:
    {
        Utils.var_dump(items,3)
        items.create(0)
        Utils.var_dump(items.get(0),3)
    }
 }

结果应如下所示:

Rectangle
{
    objectName: "object1"
    width: 50
    height: 50
    color: "#FAFAFA"
}
Rectangle
{
    objectName: "object2"
    width: 50
    height: 50
    color: "#000000"
}

对于每个ListElement,都有一个创建的委托,其中包含插入的ListElement数据。

1 个答案:

答案 0 :(得分:1)

您可以使用任何可用于实例化Model(a View)的任何内容

例如,您可以将其用作ListViewGridViewRepeater的模型。由于模型自己提供委托,因此您无需在View中指定实例化该委托的任何委托。

Column {
    Repeater {
        model: delegateModel
        // delegate: ... <--- Nothing here! Uses the delegate from the Model.
    }
}

如果使用create(index) - 方法,将创建委托,但没有父代,因此不会显示。因此,您需要设置父级,以显示它:

Button {
    onClicked:  {
        for (var a = 0; a < dm.items.count; a++) {
            var o = dm.items.create(a)
            o.parent = r
        }
    }
}

您需要注意,DelegateModel(没有PackageParts)不能在多个视图中使用,因为每个条目/委托只能在一次实例化同一时间。如果你想拥有它, 考虑使用QSortFilterProxyModel过滤内容,并根据需要使用尽可能多的Views来提供自己的代理。