右键单击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()