我的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
}
}
}
}
答案 0 :(得分:0)
原因是,使用函数修改thingsChanged
时没有things
- 信号。无论你做什么,things
中存储的引用都将保持不变。
对于ListModel
这样的数据模型,这是相同的,但是存在special signals,其中许多用于向任何视图指示它应该更新它的内容。
如果您迫切需要使用数组,只要您更改了数组内容,就需要手动调用thingsChanged()
。但由于这只表明整个阵列已经发生变化,View
的主要优势之一是无效的 - 只能改变已改变的内容。
当View
对thingsChanged
- 信号做出反应时,它会销毁所有当前的代理,然后再次重新创建它们,无论是否有任何不同。
如果您使用ListModel
或QAbstractItemModel
- 后代,View
可以插入新代理的单个实例,删除或更改它们。
答案 1 :(得分:0)
用真实的ListModel替换数组。使用函数追加!
dogName1
和主要区块 ListModel {id:model}