从 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 访问列名的主要内容,如果未能解决你的问题,请参考以下文章
从 PyQt 中的 contextMenuEvent 访问列名
从 QWidget (PyQt4) 调用 QMainWindow 中的方法/属性