我正在尝试学习如何使用UbuntuListView
。项目将在运行时添加,但为了演示,我只是对它们进行了硬编码。
我需要一种删除现有列表项的方法。这是我的代码和屏幕截图。
import QtQuick 2.4
import Ubuntu.Components 1.2
MainView {
width: units.gu(40)
height: units.gu(30)
ListModel {
id: listModel
ListElement {itemName: "one"}
ListElement {itemName: "two"}
ListElement {itemName: "three"}
}
UbuntuListView {
anchors.fill: parent
model: listModel
delegate: ListItem {
id: listItem
Label {
text: itemName
}
leadingActions: ListItemActions {
actions: [
Action {
iconName: "delete"
onTriggered: listItem.destroy()
}
]
}
}
}
}
我拖动第二个列表项并将其向右滑动。出现删除选项,但当我单击它时,出现以下错误:
Main.qml:29: Error: Invalid attempt to destroy() an indestructible object
我遵循了API 文档。
我究竟做错了什么?
顺便说一下,我还需要删除相应的模型项,但是我该怎么做呢?
答案1
顺便说一下,我还需要删除相应的模型项,但是我该怎么做呢?
显然这是解决方案:我只是从模型中删除它,视图就自行更新了。
我在列表元素中添加了一个ID:
ListElement {itemId: 1; itemName: "one"}
在操作中
onTriggered
,我搜索了该项目并将其从模型中删除:onTriggered: { for(var i = 0; i < listModel.count; i++) { if(listModel.get(i).itemId === itemId) { listModel.remove(i); break; } } }
实际上,搜索甚至没有必要。根据 API 文档QtQuick.ListView
:
该索引显示为可访问的
index
属性。
因此可以这样写:
onTriggered: {
listModel.remove(index);
}
所以我认为该物体是不可摧毁的,因为它在模型中仍然有一个对应的项目 - 这完全说得通。但在这种情况下......也许文档有点误导。