Python QTableWidget列标题的PyQt5上下文菜单
有没有办法在tables列标题上获得上下文菜单 在PyQt5的图坦卡蒙中找不到任何相关信息 表的上下文菜单很简单,但列标题不影响Python QTableWidget列标题的PyQt5上下文菜单,python,pyqt,pyqt5,qtablewidget,qmenu,Python,Pyqt,Pyqt5,Qtablewidget,Qmenu,有没有办法在tables列标题上获得上下文菜单 在PyQt5的图坦卡蒙中找不到任何相关信息 表的上下文菜单很简单,但列标题不影响 # dlg is a QDialog object self.tbl = QtWidgets.QTableWidget(dlg) self.tbl.setContextMenuPolicy( Qt.CustomContextMenu ) 您必须使用QTableWidget的QHeaderView: from PyQt5 import QtCore, QtWidget
# dlg is a QDialog object
self.tbl = QtWidgets.QTableWidget(dlg)
self.tbl.setContextMenuPolicy( Qt.CustomContextMenu )
您必须使用
QTableWidget
的QHeaderView
:
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))
您需要在标题本身上设置上下文菜单策略(如果我理解正确的话),因此 并连接到信号机
self.tbl.horizontalHeader().customContextMenuRequested.connect(self.handle_context_menu_request)
是的,谢谢!但是,如果我想为列标题和表体显示不同的菜单,这看起来有问题——或者我错了?但是,这可能是由另一个到另一个插槽来完成的——我think@jgsedi你认为是对的,我加了一个例子是的,这正是我的意思!每个元素一个插槽!非常感谢
self.tbl.horizontalHeader().customContextMenuRequested.connect(self.handle_context_menu_request)