将上下文菜单添加到特定的 Qtablewdiget 表列,Python

Posted

技术标签:

【中文标题】将上下文菜单添加到特定的 Qtablewdiget 表列,Python【英文标题】:Add context menu to a specific Qtablewdiget table column, Python 【发布时间】:2019-10-29 07:21:07 【问题描述】:

我正在尝试使用 pyQt5 将数据填充到我的 Qtablewdiget。最重要的是,我想在我的表格的特定列上添加一个上下文菜单。我已经实现了我的 Qmenu 以在整个表格上弹出,但是有人可以帮助我了解如何为特定列实现上下文菜单操作。

查看我尝试过的进一步工作的快照

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QPushButton, QAction, QApplication, QLabel, QMainWindow, QMenu)
from PyQt5 import QtCore, QtGui, QtWidgets

# setting context menu policy on my table, "self.ui.tableWidgetGraph"
self.ui.tableWidgetGraph.setContextMenuPolicy(Qt.CustomContextMenu)

# setting context menu request  by calling a function,"self.on_context_menu"
self.ui.tableWidgetGraph.customContextMenuRequested.connect(self.on_context_menu)

# define table size
self.ui.tableWidgetGraph.setRowCount(length);
self.ui.tableWidgetGraph.setColumnCount(lenColumn);

def on_context_menu(self, point):
    # show context menu
    self.contextMenu = QMenu(self)
    Task_one_action = self.contextMenu.addAction("Task_one")
    self.contextMenu.addSeparator()
    Task_two_action = self.contextMenu.addAction("Task_two")
    self.contextMenu.addSeparator()
    quit_action = self.contextMenu.addAction("Quit")

    # I want to perform actions only for a single column(E.g: Context menu only for column 4 of my table
    # Need help here....???
    action = self.contextMenu.exec_(self.ui.tableWidgetGraph.mapToGlobal(point))

    self.selected_key = ""
    for self.item in self.ui.tableWidgetGraph.selectedItems():
        self.selected_key = self.item.text()

    if action == quit_action:
        print("Executing the [Quit/Exit] Action")
        qApp.quit()

    elif action == Task_one_action:
        print("Executing Search: [Task_one_action ]")

    elif action == Task_two_action:
        print("Executing Search: [Task_two_action ]")

有人可以指导我如何仅对单个列执行上下文操作(例如:上下文菜单仅适用于我表的第 4 列中的选定项目),。谢谢

【问题讨论】:

【参考方案1】:

您可以使用itemAt获取某个位置的项目,然后使用column(),但由于它可能是一个空项目,因此无论该列是否存在,它都会返回None。

改用indexAt()(由QTableView继承,QTableWidget就是基于这个)获取模型索引:

    def on_context_menu(self, pos):
        index = self.ui.tableWidgetGraph.indexAt(pos)
        if index.isValid() and index.column() == 3:
            menu = QtWidgets.QMenu()
            menu.addAction('Action for column 4')
            menu.exec_(self.ui.tableWidgetGraph.viewport().mapToGlobal(pos))

index.isValid() 用于检查这些坐标处是否确实存在索引:例如,如果您在第四列的垂直范围内单击,但在这些坐标处尚未设置行,您将获得无效索引(没有任何行或列)。

这显然意味着,如果您需要获取该列的菜单,则无论该点是否存在行,上述方法都行不通。 如果是这种情况,您需要检查表头:

    def on_context_menu(self, pos):
        index = self.ui.tableWidgetGraph.indexAt(pos)
        validColumn = index.isValid() and index.column() == 3
        if not validColumn:
            left = self.ui.tableWidgetGraph.horizontalHeader().sectionPosition(3)
            width = self.ui.tableWidgetGraph.horizontalHeader().sectionSize(3)
            if left <= pos.x() <= left + width:
                validColumn = True
        if validColumn:
            menu = QtWidgets.QMenu()
            menu.addAction('Action for column 4')
            menu.exec_(self.ui.tableWidgetGraph.viewport().mapToGlobal(pos))

【讨论】:

以上是关于将上下文菜单添加到特定的 Qtablewdiget 表列,Python的主要内容,如果未能解决你的问题,请参考以下文章

Android将项目添加到全局上下文菜单

使用 ToolsAPI 将菜单项添加到 Delphi IDE 中单元的选项卡上下文菜单

如何将上下文菜单添加到 ListBoxItem?

如何将上下文菜单项添加到FlowDocumentScrollViewer内的textBox

如何将上下文菜单添加到 wpf 数据网格?

将项目添加到 Eclipse 文本查看器上下文菜单