PyQt4:QMenu 中不显示图标

PyQt4: icons not displayed in QMenu

我编写了以下 PyQt4 代码段:

#!/usr/bin/env python3

import sys
from typing import Callable, Optional

from PyQt4 import QtCore, QtGui


class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self._createMenuBar()

    def _createMenuBar(self):
        mainMenu = self.menuBar()

        fileMenu = mainMenu.addMenu("File")
        fileMenu.addAction(self._createFileNewAction())

    def _createFileNewAction(self) -> QtGui.QAction:
        return self._createAction(
            self.style().standardIcon(QtGui.QStyle.SP_DialogSaveButton),
            "New",
            QtGui.QKeySequence.New,
            "Load new image to be annotated",
            self._fileNew
        )

    def _createAction(
            self,
            icon: Optional[QtGui.QIcon],
            name: str,
            shortcut: Optional[QtGui.QKeySequence],
            tooltip: Optional[str],
            callback: Callable[[], None]
        ) -> QtGui.QAction:

        if icon is not None:
            action = QtGui.QAction(icon, name, self)
        else:
            action = QtGui.QAction(name, self)

        if shortcut is not None:
            action.setShortcut(shortcut)

        action.setToolTip(tooltip)
        action.setToolTip(tooltip)

        self.connect(action, QtCore.SIGNAL('triggered()'), callback)

        return action   

    def _fileNew(self):
        pass


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    mainWin = MainWindow()
    mainWin.show()

    app.exec_()

当我执行该程序时,我希望 SP_DialogSaveButton 图标显示在 "File" 下拉菜单中的 "New" 字段旁边,但事实并非如此。 PyQt 肯定能够找到图标本身,我已经尝试用与上面相同的方式获取它并在单独的 QLabel 中显示它,效果很好。

谁能告诉我这是怎么回事?

问题不是标准图标,如果您使用任何图标,您都会观察到相同的行为。

在 Qt4 中,QActions 的图标隐藏在菜单中,要使它们可见,有两种可能性:

  • 禁用 Qt::AA_DontShowIconsInMenus 属性:

    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        app.setAttribute(QtCore.Qt.AA_DontShowIconsInMenus, False)
        mainWin = MainWindow()
        mainWin.show()
        sys.exit(app.exec_())
    
  • 使用QActionsetIconVisibleInMenu()方法:

    action = QtGui.QAction(icon, name, self)
    action.setIconVisibleInMenu(True)