Qml-为什么删除模型时不删除表视图中委托数据

时间:2018-09-27 07:16:15

标签: qt qml

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位

2 个答案:

答案 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();
    }
}