python - 在 PyQt5 中显示 QMenu 的问题
问题描述
当在 QTableWidget 上右键单击一行时,我试图显示一个 QMenu。问题是每当菜单出现时,它都会显示为一个点。您可以在下面找到一个最小的可重现示例。
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import (QApplication, QAction, QMenu, QTableWidget,
QAbstractItemView)
class PhotoSetTable(QTableWidget):
_menu = None
def __init__(self, parent=None):
super().__init__(parent)
self.setRowCount(0)
self.setColumnCount(2)
self.setHorizontalHeaderLabels(["Name", "Count"])
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self._menu = self._generate_menu()
row_position = self.rowCount()
self.insertRow(row_position)
name_item = QtWidgets.QTableWidgetItem("asd")
name_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
count_item = QtWidgets.QTableWidgetItem("0")
count_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
self.setItem(row_position, 0, name_item)
self.setItem(row_position, 1, count_item)
#self._refresh()
@staticmethod
def _generate_menu():
menu = QMenu()
menu.addAction(QAction("Quit"))
menu.addSeparator()
menu.addAction(QAction("WUUU"))
menu.addSeparator()
return menu
def mousePressEvent(self, e):
super().mousePressEvent(e)
if e.buttons() == QtCore.Qt.RightButton:
item = self.itemAt(e.pos())
if item is not None:
self._menu.exec(e.globalPos())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = PhotoSetTable()
ex.show()
sys.exit(app.exec_())
是什么导致了这种行为?
解决方案
问题在于添加QAction
到生成的上下文菜单中。相反,尝试添加菜单项,将项目名称作为字符串作为第一个参数,并将它应该调用的方法作为第二个参数。
@staticmethod
def _generate_menu():
menu = QMenu()
menu.addAction("Quit", lambda: print('quitting'))
menu.addSeparator()
menu.addAction("WUUU", method_name)
menu.addSeparator()
return menu