如何从 UbuntuListView 中删除?

如何从 UbuntuListView 中删除?

我正在尝试学习如何使用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);
}

所以我认为该物体是不可摧毁的,因为它在模型中仍然有一个对应的项目 - 这完全说得通。但在这种情况下......也许文档有点误导。

相关内容