PyQt4:QMenu中未显示图标

时间:2018-08-11 12:30:11

标签: python python-3.x pyqt pyqt4

我编写了以下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图标显示在“文件”下拉菜单中“新”字段的旁边,但不是。 PyQt绝对能够找到图标本身,我尝试过以与上述相同的方式获取它,并在单独的QLabel中显示它,效果很好。

有人可以告诉这里发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

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

在Qt4中,QAction的图标隐藏在菜单中,为了使其可见,有两种可能:

  • 禁用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_())
    
  • 使用QAction的{​​{3}}方法:

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