Контекстное меню PyQt5 для заголовка столбца QTableWidget - PullRequest
0 голосов
/ 12 февраля 2019

есть ли способ получить контекстное меню в заголовке столбца таблицы.

Ничего не найти об этом в текстах PyQt5.

контекстное меню таблицы простое, но заголовки столбцов неT влияет.

# dlg is a QDialog object
self.tbl = QtWidgets.QTableWidget(dlg)
self.tbl.setContextMenuPolicy( Qt.CustomContextMenu )

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вам нужно установить политику контекстного меню для самого заголовка (если я правильно понял), поэтому ...

self.tbl = QtWidgets.QTableWidget(dlg)
self.tbl.horizontalHeader().setContextMenuPolicy(Qt.CustomContextMenu)

и подключиться к `QHeaderView :: customContextMenuRequested сигнал ...

self.tbl.horizontalHeader().customContextMenuRequested.connect(self.handle_context_menu_request)
0 голосов
/ 12 февраля 2019

Вы должны использовать QHeaderView из QTableWidget:

from PyQt5 import QtCore, QtWidgets

class Dialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.tbl = QtWidgets.QTableWidget(10, 10, self)

        for w in (self.tbl.horizontalHeader(), self.tbl.verticalHeader(), self.tbl):
            w.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
            w.customContextMenuRequested.connect(self.on_customContextMenuRequested)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.tbl)

    @QtCore.pyqtSlot(QtCore.QPoint)
    def on_customContextMenuRequested(self, pos):
        widget = self.sender()
        if isinstance(widget, QtWidgets.QAbstractItemView):
            widget = widget.viewport()
        menu = QtWidgets.QMenu()
        menu.addAction("Foo Action")
        menu.exec_(widget.mapToGlobal(pos))

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())

Обновление:

class Dialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.tbl = QtWidgets.QTableWidget(10, 10, self)

        self.tbl.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.tbl.customContextMenuRequested.connect(self.on_customContextMenuRequested_tw)

        self.tbl.verticalHeader().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.tbl.verticalHeader().customContextMenuRequested.connect(self.on_customContextMenuRequested_vh)

        self.tbl.horizontalHeader().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.tbl.horizontalHeader().customContextMenuRequested.connect(self.on_customContextMenuRequested_hh)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.tbl)

    @QtCore.pyqtSlot(QtCore.QPoint)
    def on_customContextMenuRequested_tw(self, pos):
        menu = QtWidgets.QMenu()
        menu.addAction("Foo Action TW")
        menu.exec_(self.tbl.viewport().mapToGlobal(pos))

    @QtCore.pyqtSlot(QtCore.QPoint)
    def on_customContextMenuRequested_vh(self, pos):
        menu = QtWidgets.QMenu()
        menu.addAction("Foo Action VH")
        menu.exec_(self.tbl.verticalHeader().mapToGlobal(pos))

    @QtCore.pyqtSlot(QtCore.QPoint)
    def on_customContextMenuRequested_hh(self, pos):
        menu = QtWidgets.QMenu()
        menu.addAction("Foo Action HH")
        menu.exec_(self.tbl.horizontalHeader().mapToGlobal(pos))
...