【问题标题】:PyQt5 context menu for QTableWidget column headQTableWidget 列标题的 PyQt5 上下文菜单
【发布时间】:2019-07-06 13:40:32
【问题描述】:

有没有办法在表格列标题上获取上下文菜单。

在 PyQt5 的 tuts 中一无所获。

表格的上下文菜单很简单,但列标题不影响。

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

【问题讨论】:

    标签: python pyqt pyqt5 qtablewidget qmenu


    【解决方案1】:

    你必须使用QTableWidgetQHeaderView

    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))
    

    【讨论】:

    • 好的,谢谢!但是,如果我想为列标题和表格正文显示不同的菜单,它看起来有问题 - 或者我错了?但它可以完成 - 可能 - 由另一个到另一个插槽 - 我认为
    • @jgsedi 你觉得对的,我加了一个例子
    • 是的,这正是我的意思!每个元素一个插槽!非常感谢
    【解决方案2】:

    您需要在标题本身上设置上下文菜单策略(如果我理解正确的话),所以...

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

    并连接到`QHeaderView::customContextMenuRequested 信号...

    self.tbl.horizontalHeader().customContextMenuRequested.connect(self.handle_context_menu_request)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      相关资源
      最近更新 更多