我一直在使用PyQt5开发GUI,并希望包含一个菜单栏。但是,当我编写此功能的代码时,将不会出现我的菜单。弄清我对如何在PyQt5中实现菜单栏的理解之后,我在网上寻找了一个预先存在的示例。通过一些调整,我开发了以下测试用例:

import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenuBar, QAction, qApp

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        exitAction = QAction(QIcon('exit.png'), '&Exit', self)
        exitAction.triggered.connect(qApp.quit)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&Testmenu')
        fileMenu.addAction(exitAction)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

但是,当我运行此命令时,找不到Testmenu

在使用pyuic5将.ui文件转换为可导入的.py之前,我还尝试了在QTCreator中创建菜单栏(以及我的GUI布局的其余部分)。我以为这样可以消除一些编程错误,但是菜单栏仍然不会显示。有什么想法吗?

编辑:

我在Jupyter笔记本4.1版中使用Python 3.5(Anaconda 4.1)运行此代码。我还使用了运行OS 10.1l,PyQt 5.7和Qt版本5.7.0的Macbook。

我已经意识到,如果我单击应用程序窗口,然后再单击回到窗口,菜单栏将变得敏感-有效地使应用程序失去焦点并集中精力。有了这些信息,我意识到我不是第一个注意到此问题的人(请参阅https://github.com/robotology/yarp/issues/457)。不幸的是,我仍然不确定如何解决该问题。

最佳答案

这不是Qt和PyQt5错误。

我认为您的代码是zetcode pyqt5 menubar tutorial。我在Mac OS上遇到了完全相同的问题。

第一个解决方案是一个把戏。使用' &Exit'而不是'&Exit'。像这样在'&Exit'的开头插入一个空格:

...
# exitAction = QAction(QIcon('exit.png'), '&Exit', self) # Not shown
exitAction = QAction(QIcon('exit.png'), ' &Exit', self)
...

macOS的系统级菜单栏保留诸如"Exit""Quit"等的关键字。出于相同的原因,yurisnm's example code仅显示Mac OS上除"Quit"之外的菜单项。实际上,“Quit”具有TextHeuristicRole,因此将覆盖“应用程序”菜单中的“Quit”行为。当您在“Python”菜单中单击“退出python”时,它不会退出,而仅显示“退出触发”。

如果您必须在其他菜单中使用该名称(例如,文件,编辑),则需要像上面一样更改操作名称或使用QAction::setMenuRole(...)这样:
...
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
print(exitAction.menuRole()) # It prints "1". QAction::TextHeuristicRole
exitAction.setMenuRole(QAction.NoRole)
...

请阅读以下内容,它将对您有帮助。
  • https://stackoverflow.com/a/11387977/5362866
  • http://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
  • 关于python - PyQt5中缺少menuBar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39574105/

    10-14 22:58