Как отобразить контекстное меню для выбранного элемента в TableView - PullRequest
1 голос
/ 21 января 2020

Вот что я сейчас нахожусь в 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)
        }
    }
}

, когда я выбираю элемент и нажимаю Удалить , выбранные элементы удаляются, НО я еще не был возможность отображать contextMenu по правому клику и удалять выбранный элемент. 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 .

Я пытался добавить MouseArea в некоторые другие signal-handler, в дополнение к onClicked, внутри TableView НО пока не повезло!

1 Ответ

2 голосов
/ 21 января 2020

В следующем примере показано, как использовать контекстное меню (я не использовал список 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)
        }
    }
}
...