从 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()))
使用 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()))