从 PyQt 中的 contextMenuEvent 访问列名称

Access column name from a contextMenuEvent in PyQt

使用 QTableView,我在 header 中添加了 contextMenuEvent。我需要访问列 header 我单击以对列名称执行操作。

一些代码:

class MyTableView(QTableView):
    def __init__(self):
        super().__init__()
        self.horizontalHeader().setContextMenuPolicy(Qt.CustomContextMenu)
        self.horizontalHeader().customContextMenuRequested.connect(self.selectMenu)


    def selectMenu(self, event):
        """ A right click on a column name allows the info to be displayed in the graphView """
        menu = QMenu(self)
        selectAction = QAction("Display on graph", self)
        menu.addAction(selectAction)
        menu.popup(QCursor.pos())
        print(type(self.horizontalHeader())) # returns QHeaderView

不幸的是,QHeaderView class 中没有检索 header 数据的函数。

我还尝试使用 QTableView.columnAt() 函数访问该列:

print(self.columnAt(QCursor.pos().x())) # returns -1

如您所见,它不起作用,因为根据 QTableView 文档,QCursor 不在 "valid index" 上。

编辑

使用 event.x() 而不是 QCursor.pos().x()

print(self.columnAt(event.x())) # returns the column index or -1 if not a valid column

QCursor.pos() returns 全局坐标(并显示当前鼠标位置,而不是事件发生的位置)。请改用 QContextMenuEvent.pos(),它位于本地小部件坐标中。

如果你真的非常想用QCursor.pos()获取当前鼠标位置,使用table的mapFromGlobal()方法(继承自QWidget)来转换为本地坐标。

def selectMenu(self, event):
    """ A right click on a column name allows the info to be displayed in the graphView """
    menu = QMenu(self)
    selectAction = QAction("Display on graph", self)
    menu.addAction(selectAction)
    menu.popup(event.pos())
    print(type(self.horizontalHeader())) # returns QHeaderView
    print(self.columnAt(event.x()))