当字符串数组模型更改时,ListView不会刷新

时间:2017-07-12 13:44:37

标签: qt qml qt5 qtquick2 qtquickcontrols2

我的ListView在添加时不会在我的模型中显示新条目。

当对话框打开时,我将QStringList从C ++项复制到Qml属性中。 然后,用户使用提供的控件(添加,修改,删除)修改数组。

遗憾的是,当我修改属性时,ListView不会更新。该属性已正确修改(如调试输出所示)。

如何使用数据绑定自动更新ListView?

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    property var things

    Component.onCompleted: things = [] // normally retrieved from C++ QStringList

    ColumnLayout {
        anchors.fill: parent

        RowLayout {
            Layout.fillWidth: true

            TextField {
                Layout.fillWidth: true
                id: theTextField
            }

            Button {
                Layout.fillWidth: true
                text: qsTr("Append")
                onPressed: {
                    things.push(theTextField.text)
                    console.log(things)
                }
            }

            Button {
                Layout.fillWidth: true
                text: qsTr("Remove")
                onPressed: {
                    var index = things.indexOf(theTextField.text)
                    if(index == -1)
                        console.warn('Not found!')
                    else
                        things.splice(index, 1)
                    console.log(things)
                }
            }

            Button {
                Layout.fillWidth: true
                text: qsTr("Clear");
                onPressed: {
                    things = [];
                    console.log(things)
                }
            }
        }

        ListView {
            id: listView

            Layout.fillWidth: true
            Layout.fillHeight: true
            model: things
            delegate: Label {
                text: modelData
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

原因是,使用函数修改thingsChanged时没有things - 信号。无论你做什么,things中存储的引用都将保持不变。

对于ListModel这样的数据模型,这是相同的,但是存在special signals,其中许多用于向任何视图指示它应该更新它的内容。

如果您迫切需要使用数组,只要您更改了数组内容,就需要手动调用thingsChanged()。但由于这只表明整个阵列已经发生变化,View的主要优势之一是无效的 - 只能改变已改变的内容。

ViewthingsChanged - 信号做出反应时,它会销毁所有当前的代理,然后再次重新创建它们,无论是否有任何不同。

如果您使用ListModelQAbstractItemModel - 后代,View可以插入新代理的单个实例,删除或更改它们。

答案 1 :(得分:0)

用真实的ListModel替换数组。使用函数追加!

dogName1

和主要区块   ListModel {id:model}