右键单击QTableView的未被占用区域时如何触发事件
How to trigger an event when right clicking on the unoccupied area of a QTableView
我有一个基本上由 QTableView
组成的应用程序。我想在 table 视图的未占用区域上单击鼠标右键时显示上下文菜单。 QTableWidget
有一个 itemAt
方法可以解决这个问题,但不幸的是,为了满足我的目的,我必须使用缺少此方法的 QTableView
。我也尝试使用事件过滤器但没有成功。你知道要实现这个吗?
我终于找到了一种方法来做到这一点:
def mousePressEvent(self, event):
if self.model() is None:
return
if self.rowAt(event.pos().y()) == -1:
self.onShowContextualMenu(event.pos())
return super(FileSystemTableView, self).mousePressEvent(event)
您必须使用 indexAt()
method and verify that QModelIndex
无效:
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QApplication, QMenu, QTableView
class TableView(QTableView):
def contextMenuEvent(self, event):
super().contextMenuEvent(event)
ix = self.indexAt(event.pos())
if not ix.isValid():
menu = QMenu()
menu.addAction("foo")
menu.addAction("bar")
menu.addAction("baz")
menu.exec_(event.globalPos())
def main():
app = QApplication([])
view = TableView()
view.resize(640, 480)
view.show()
model = QStandardItemModel(4, 5)
view.setModel(model)
app.exec_()
if __name__ == "__main__":
main()
我有一个基本上由 QTableView
组成的应用程序。我想在 table 视图的未占用区域上单击鼠标右键时显示上下文菜单。 QTableWidget
有一个 itemAt
方法可以解决这个问题,但不幸的是,为了满足我的目的,我必须使用缺少此方法的 QTableView
。我也尝试使用事件过滤器但没有成功。你知道要实现这个吗?
我终于找到了一种方法来做到这一点:
def mousePressEvent(self, event):
if self.model() is None:
return
if self.rowAt(event.pos().y()) == -1:
self.onShowContextualMenu(event.pos())
return super(FileSystemTableView, self).mousePressEvent(event)
您必须使用 indexAt()
method and verify that QModelIndex
无效:
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QApplication, QMenu, QTableView
class TableView(QTableView):
def contextMenuEvent(self, event):
super().contextMenuEvent(event)
ix = self.indexAt(event.pos())
if not ix.isValid():
menu = QMenu()
menu.addAction("foo")
menu.addAction("bar")
menu.addAction("baz")
menu.exec_(event.globalPos())
def main():
app = QApplication([])
view = TableView()
view.resize(640, 480)
view.show()
model = QStandardItemModel(4, 5)
view.setModel(model)
app.exec_()
if __name__ == "__main__":
main()