PyQt 菜单栏 Mac OSX 雪豹

7 投票
4 回答
7656 浏览
提问于 2025-04-15 19:15

我正在尝试在一个简单的PyQt示例中向应用程序的菜单栏添加一个项目。但是,下面的代码似乎根本没有改变菜单栏,菜单里只有一个“Python”。以下是大部分代码,省略了导入和实例化的部分。

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.resize(250, 150)
        self.setWindowTitle('menubar')
        self.modal = False

        exit = QtGui.QAction( QtGui.QIcon('images/app_icon.png'), 'Exit', self )
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')
        self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

        menubar = self.menuBar()
        file = menubar.addMenu('File')
        file.addAction(exit)

我还尝试创建一个新的 QMenuBar,然后使用 setMenuBar() 方法手动替换菜单栏。

上面的代码片段有什么明显的错误吗?

4 个回答

6

我知道这个问题已经很久了,但因为我也遇到了同样的问题,所以想分享一下我的发现。原来我创建了一个退出应用程序的操作,而这个操作在OSX系统中是留给应用菜单用的,所以文件菜单就没有显示出来。当我在同一个菜单上创建了一个新的操作后,文件菜单就出现了。

我用同样的方法在其他操作系统上也成功了:

self.menubar = self.menuBar()

这个是在一个QMainWindow对象里面创建的。

希望这对大家有帮助!

7

在Mac上使用PyQt时,系统会拦截一些包含“Quit”(退出)或“Exit”(退出)的命令,并把它们从菜单栏中移除,因为这些命令在其他地方已经存在。如果菜单栏的某个标题下没有任何项目,它就不会显示,这样看起来就像你没有对菜单栏进行任何修改一样。

#exit = QtGui.QAction( 'Exit', self ) #this fails on my system
exit = QtGui.QAction( 'SomethingElse', self ) #this displays on my system
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exit)

另外,调用raise_()并不会改变我Mac上的菜单栏。如果我使用raise_(),我必须手动选择窗口(先点击其他地方再点击回来),才能让我的PyQt应用程序显示正确的菜单栏。

还要记住,Mac的菜单栏是在系统菜单栏中显示的,而不是像Windows或Linux那样在窗口中显示。这就引出了另一个解决方案,正如Levi501和Swdev所建议的。那就是使用一个非原生的菜单,它会像这样出现在窗口中:

menubar = self.menuBar()
menubar.setNativeMenuBar(False)

作为一个经常使用Windows和Linux的人,这对我的项目来说更有意义。

我在这里找到了关于“Exit”的信息:http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html

3

我这台电脑上没有安装PyQt,所以没法测试这个,不过我觉得在Mac上,QMainWindow.menuBar()这个函数不会返回整个应用的菜单栏。

你可以试着创建一个菜单栏,像这样:

menubar = QtGui.MenuBar()

我这个说法是根据QMainWindow.menuBar()函数的文档来的,具体可以查看这里:

http://doc.qt.io/qt-4.8/qmainwindow.html#menuBar

你也可以看看这个页面上标注为QMenuBar在Mac OS X上的使用的部分:

http://doc.qt.io/qt-4.8/qmenubar.html#details

希望这些信息对你有帮助!

撰写回答