如何在 TableView 中的选定项目上显示上下文菜单

How to display contextmenu on selected item in TableView

这是我现在 TableView 中的内容:

TableView{
    model: testContext.list
    TableViewColumn{
        width: parent.width / 2
        title: "Name"
        delegate: Text {
            text: modelData.name
        }
    }
    TableViewColumn{
        width: parent.width / 2
        title: "Age"
        delegate: Text {
            text: modelData.age
        }
    }
    Keys.onDeletePressed: testContext.removeItem(currentRow)
    onClicked: {
        console.log(row)
    }

    Menu {
        id: contextMenu
        MenuItem {
            text: "Delete"
            onClicked: testContext.removeItem(currentRow)
        }
    }
}

当我 select 一个项目并点击 删除 时,selected 项目被删除但是我还不能显示 contextMenu 右键单击​​并删除 selected 项目。 testContext.list 是一个 QVector<QObject*> 并且在 ListView/GridView 中我可以有这样的东西:

ListView/GridView{
    id: listView
    anchors.fill: parent
    model: testContext.list
    //cellHeight:
    //cellWidth:

    delegate: Text{
        text: modelData.name + " " + modelData.age
        MouseArea {
            acceptedButtons: Qt.LeftButton | Qt.RightButton
            anchors.fill: parent
            onClicked: {
                listView.currentIndex = index
                listView.forceActiveFocus()
                if (mouse.button == Qt.RightButton)
                    contextMenu.popup()
            }
        }
    }

    Menu {
        id: contextMenu
        MenuItem {
            text: "Delete"
            onClicked: testContext.removeItem(listView.currentIndex)
        }
    }

    Keys.onDeletePressed: testContext.removeItem(listView.currentIndex)

    highlight: Rectangle {
        color: "lightgray"
        width: listView.width
    }
}

通过点击 删除 或使用 contextMenu.

删除项目

除了 onClicked 之外,我还尝试在其他 signal-handler 中添加 MouseArea,但目前还没有成功!

以下示例显示了如何使用上下文菜单(我没有使用 QObject 列表,因为在这种情况下模型是无关紧要的,所以为了简化我的示例使用 ListModel)

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 1.4 as QQC1
import QtQuick.Controls 2.14 as QQC2

Window {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListModel {
        id: libraryModel
        ListElement {
            title: "A Masterpiece"
            author: "Gabriel"
        }
        ListElement {
            title: "Brilliance"
            author: "Jens"
        }
        ListElement {
            title: "Outstanding"
            author: "Frederik"
        }
    }
    QQC1.TableView {
        id: tableview
        x:100
        y:100
        width: 400
        height: 400
        model: libraryModel
        QQC1.TableViewColumn {
            role: "title"
            title: "Title"
            width: 100
        }
        QQC1.TableViewColumn {
            role: "author"
            title: "Author"
            width: 200
        }
        MouseArea{
            anchors.fill: parent
            propagateComposedEvents: true
            acceptedButtons: Qt.RightButton
            onClicked:  {
                var row = tableview.rowAt(mouseX, mouseY)
                if(row >= 0){
                    console.log(row)
                    tableview.currentRow = row
                    tableview.selection.clear()
                    tableview.selection.select(row, row)
                    contextMenu.popup()
                }
            }
        }
    }
    QQC2.Menu {
        id: contextMenu
        QQC2.MenuItem {
            text: "Delete"
            onClicked: libraryModel.remove(tableview.currentRow)
        }
    }
}