从 PyQt 中的 contextMenuEvent 访问列名

Posted

技术标签:

【中文标题】从 PyQt 中的 contextMenuEvent 访问列名【英文标题】:Access column name from a contextMenuEvent in PyQt 【发布时间】:2018-03-12 08:31:24 【问题描述】:

使用QTableView,我在标题中添加了contextMenuEvent。我需要访问我单击的列标题才能对列名进行处理。

一些代码:

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 类中没有用于检索标头数据的函数。

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

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

如您所见,它不起作用,因为根据 QTableView 文档,QCursor 不在“有效索引”上。

编辑

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

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

【问题讨论】:

【参考方案1】:

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

如果您真的非常想使用QCursor.pos() 获取当前鼠标位置,请使用表格的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()))

【讨论】:

您更正的最后一行出现了错误。你应该用columnAt(event.x()) 更正它,这对我来说很好。谢谢=)

以上是关于从 PyQt 中的 contextMenuEvent 访问列名的主要内容,如果未能解决你的问题,请参考以下文章

从pyqt4中的listWidget返回值

从 PyQt 中的 contextMenuEvent 访问列名

从 QWidget (PyQt4) 调用 QMainWindow 中的方法/属性

pyqt - 如何从状态栏中的小部件中删除边框?

从 PyQt5 中的 QTableWidget 中删除单元格填充

从 linux 中的 acpi 事件执行 PyQt 应用程序