将上下文菜单添加到特定的 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 ToolsAPI 将菜单项添加到 Delphi IDE 中单元的选项卡上下文菜单