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

Posted

技术标签:

【中文标题】如何在 TableView 中的选定项目上显示上下文菜单【英文标题】:How to display contextmenu on selected item in TableView 【发布时间】:2020-01-21 17:17:25 【问题描述】:

这是我现在在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)
        
    

当我选择一个项目并点击 Delete 时,选定的项目会被删除但我还不能在右键单击和删除选定的项目时显示 contextMenutestContext.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
    

通过点击Delete或使用contextMenu来删除项目。

我尝试在onClickedTableView 内部添加MouseArea,在其他signal-handler 中添加一个TableView,但到目前为止没有运气!

【问题讨论】:

【参考方案1】:

以下示例显示了如何使用上下文菜单(我没有使用 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)
        
    

【讨论】:

以上是关于如何在 TableView 中的选定项目上显示上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK如何将tableview中plist中的选定行传递到UIViewController

如何在前一个 tableview 控制器的 detailtext 标签中显示选定的选择器日期

QML Tableview显示选定行的值

从 JavaFX TableView 中获取选定项目

如何根据javafx中的Action为同一个tableview提供一个Contextmenu?

WPF Toolkit:如何滚动数据网格以显示后面代码中的选定项目?