更新已过滤的DelegateModel的内部模型数据

时间:2016-01-20 10:52:30

标签: qt qml

我尝试在QML中更新DelegateModel(或VirtualDataModel)的数据。

传递给DelegateModel的模型数据似乎没有被触发到"拥有"过滤了DelegateModel的模型。

那么,如何更新DelegateModel的内部模型?

我用

尝试
visualDataModel.items.get(1).model.name = "clicked"

似乎更新了内部模型。但这个结构看起来更像是一个黑客......

工作示例:

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQml.Models 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2

Window {
    visible: true

    width: 400
    height: 400

    ListModel {
        id: listModel
        ListElement {
            name: "test1"
            key0: "1"
        }
        ListElement {
            name: "test2"
            key0: "1"
        }
        ListElement {
            name: "test3"
            key0: "0"
        }
        ListElement {
            name: "test4"
            key0: "0"
        }
    }

    ListView {
        id: listView
        anchors.left: parent.left
        anchors.right: parent.right
        height: 200

        model: visualDataModel
    }

    Button {
        id: b
        anchors.top: listView.bottom
        text: "click me"

        onClicked: {
            listModel.get(1).name = "Clicked"
        }
    }

    DelegateModel {
        id: visualDataModel

        model: listModel

        groups: [
            VisualDataGroup {
                includeByDefault: false
                name: "key0"
            }

        ]

        filterOnGroup: "key0"

        delegate: Item {
            height: 50
            width: 50
            Text {
                text: name
            }
        }

        Component.onCompleted: {
            var rowCount = listModel.count;
            items.remove(0, rowCount);
            for(var i=0;i<rowCount;i++) {
                var entry = listModel.get(i);
                if(entry.key0 === "1") {
                    items.insert(entry, "key0");
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您可以从委托进行模型数据模拟。我已经改变了你的代表:

delegate: Item {
    height: 50
    width: 50
    Text {
        id: txt
        anchors.top: parent.top
        text: name
    }
    Button {
        id: b
        anchors.top: txt.bottom
        text: "click me"

        onClicked: {
            name = "Clicked " + name
        }
    }
}

此外,我已从外部代表中删除了按钮。

现在每次在模型更改时单击delegete数据内的按钮。

答案 1 :(得分:0)

items.insert将创建新项目。 所以你应该使用items.setGroups,第三个参数是一个字符串数组,它必须包含“items”

祝你好运!