import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
text:"add"
onClicked: {
listmodel.append({"StartTime":"","EndTime":""})
}
}
Button {
text:"delete"
anchors.right: parent.right
onClicked: {
tableview.selection.forEach(function(rowIndex){
listmodel.remove(rowIndex)
})
}
}
TableView {
id:tableview
width: 640
height: 450
anchors.bottom: parent.bottom
selectionMode: SelectionMode.SingleSelection
rowDelegate:Rectangle {
color: styleData.selected?"blue":"white"
height: 50
}
model: ListModel{
id:listmodel
}
TableViewColumn {
role:"StartTime"
width: 300
delegate: TextField{
text: styleData.value
onActiveFocusChanged: {
if(!activeFocus)
text = "2010-09-03"
}
}
}
TableViewColumn {
role:"EndTime"
width: 300
delegate: TextField{
text: styleData.value
}
}
}
}
第一步是向Tableview添加一行,然后自动在第一列中填写数据,然后选择要删除的第一行,然后添加新行,第一列中的数据仍然存在。
Qt的版本为5.9.6MSVC2015 64位
答案 0 :(得分:0)
快速检查发现以下结果:
TableView似乎在创建了委托后就会回收。这意味着它们不会被删除,而是保留以备将来使用。重用它们时,它们将只更改公开的数据styleData
,从而更新绑定。
要证明删除模型条目时对象没有被破坏,请将委托更改为:
delegate: TextField{
text: styleData.value
onActiveFocusChanged: { if(!activeFocus) text = "2010-09-03" }
Component.onCompleted: console.log(this, "has been created")
Component.onDestruction: console.log(this, "will be destroyed")
}
由于您用以下行中断了对模型数据的绑定:
onActiveFocusChanged: { if(!activeFocus) text = "2010-09-03" }
在重复使用的项目中,值不会再次更新。
~~~对于为什么来说就这么多。
你能做什么?好吧,显而易见的是,不要破坏绑定。
最简单的方法是更改模型中的值,而不是设置文本:
onActiveFocusChanged: { if(!activeFocus) model.startTime = "2010-09-03" }
但这可能是不需要的吗?
通读TableView
的代码,我发现了两个有趣的注释:
这可能解释了此功能背后的意图。
答案 1 :(得分:-1)
因为tableview
在您更改listmodel
时没有自动更新。
它将起作用:
Button {
text:"remove"
anchors.right: parent.right
onClicked: {
tableview.selection.forEach(function(rowIndex){
listmodel.remove(rowIndex)
})
tableview.update();
}
}