首页 > 解决方案 > 在 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_())

是什么导致了这种行为?

标签: pythonpython-3.xpyqtpyqt5

解决方案


问题在于添加QAction到生成的上下文菜单中。相反,尝试添加菜单项,将项目名称作为字符串作为第一个参数,并将它应该调用的方法作为第二个参数。

@staticmethod
def _generate_menu():
    menu = QMenu()
    menu.addAction("Quit", lambda: print('quitting'))
    menu.addSeparator()
    menu.addAction("WUUU", method_name)
    menu.addSeparator()

    return menu

推荐阅读