在PyQt5中缺少menuBar

时间:2016-09-19 13:12:50

标签: python macos pyqt pyqt5 menubar

我一直在使用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无处可寻。

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

编辑:

我在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)。不幸的是,我仍然不确定如何解决这个问题。

6 个答案:

答案 0 :(得分:4)

这不是Qt和PyQt5 Bug。

我认为您的代码是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仅显示除"Quit"以外的菜单项在Mac OS上。实际上“退出”有TextHeuristicRole,因此在应用程序菜单中覆盖“退出”行为。当您在“Python”菜单中单击“退出python”时,它不会退出并只打印“退出触发”。

如果您必须在其他菜单中使用该名称(例如文件,编辑),您需要更改上面的操作名称或使用QAction::setMenuRole(...),如下所示:

...
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
print(exitAction.menuRole()) # It prints "1". QAction::TextHeuristicRole
exitAction.setMenuRole(QAction.NoRole)
...

请阅读以下内容,它会对您有所帮助。

答案 1 :(得分:4)

如果你的程序在Ubuntu上运行,你可能会在屏幕顶部找到你的菜单栏。

如果要将菜单栏移动到窗口的标题栏,可以在“系统设置/外观/行为/显示窗口菜单/窗口标题栏”中切换设置。

答案 2 :(得分:3)

菜单栏在PyQt5中不可见

bar = self.menuBar()

bar.setNativeMenuBar(False)

file = bar.addMenu("File")

file.addAction("New")

NativeMenuBar属性指定菜单栏是否应在支持它的平台上用作本机菜单栏。如果此属性为true,则菜单栏将在本机菜单栏中使用,而不在其父窗口中使用;如果为false,则菜单栏仍保留在窗口中。

示例程序

import sys

from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication

from PyQt5.QtGui import QIcon


class Menu(QMainWindow):

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


    def initUI(self):               

        exitAct = QAction(QIcon('exit.png'), ' &Quit', self)   

        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)

        bar = self.menuBar()
        file = bar.addMenu("Edit")
        file.addAction("New")

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Simple menu')    
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Menu()
    sys.exit(app.exec_())

答案 3 :(得分:0)

试试这个:

menubar = QMenuBar()
self.setMenuBar(menubar)

而不是menubar = self.menuBar()

答案 4 :(得分:0)

您是否尝试过以下链接tutorialspoint中最简单的示例。

这是最简单的例子。

int

答案 5 :(得分:0)

在MacOS中,应用程序菜单出现在屏幕顶部。通过在字符串“ Quit”前面加上空字符,我设法使Quit菜单选项出现在上面的示例中,如下所示:

close = QAction("\0Quit",self)
close.setShortcut("Ctrl+Q")
file.addAction(close)

macOS似乎以某种方式截获了名为“ Quit”或“ Exit”的菜单项。 无需解决方法,您可以愉快地使用“关闭”或“离开”。