PyQt MenuBar Mac OSX Snow Leopard

时间:2010-02-14 02:07:35

标签: python macos osx-snow-leopard pyqt menubar

我正在尝试将一个项添加到一个简单的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 个答案:

答案 0 :(得分:6)

我知道这个问题已经过时但是,由于我遇到了同样的问题,我发现因为我正在创建一个退出应用程序的操作并且此操作在OSX上保留到应用程序菜单,因此文件菜单没有出现。当我在同一菜单上创建一个新动作时,它变得可用。 这适用于其他操作系统使用相同的方法:

self.menubar = self.menuBar()

这是在QMainWindow对象中创建的。

希望这对任何人都有帮助!

答案 1 :(得分:4)

在Mac上使用PyQt时,系统会拦截某些包含“退出”或“退出”字样的命令,并将它们从菜单栏中删除,因为它们存在于其他地方。如果菜单栏标题没有项目,它将不会显示,使其看起来好像您没有修改菜单栏。

#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 menubars显示在系统菜单栏中,而不是像Windows或Linux机器上那样显示在窗口中。这导致我们采用Levi501和Swdev建议的另一种解决方案。那就是使用窗口中出现的非原生菜单,如下所示:

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

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

我在此处找到了“退出”信息:http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html

答案 2 :(得分:3)

我没有在这台机器上安装PyQt来测试它,但我认为在Mac上QMainWindow.menuBar()功能不会返回应用程序范围的菜单栏。

您可以尝试创建一个菜单栏,如:

menubar = QtGui.MenuBar()

我的基础是QMainWindow.menuBar()函数的文档:

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

您还可以在此页面上查看标有 QMenuBar on Mac OS X 的部分:

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

希望有所帮助!

答案 3 :(得分:2)

正确。在MAC OS上我们需要像这样使用菜单栏:

self.menubar = QtGui.QMenuBar() 

而不是这样:

self.menubar = QtGui.QMenuBar(MainWindow) 

(没有MainWindow参数)

我建议最好的解决方案是使用QTDesiner构建UI布局,然后使用pyside-uic工具转换为不同平台上的Python类。当我使用在MAC上在Windows上编译的UI布局类时,我遇到了这个问题。通过使用命令pyside-uic AppMain.ui -o ui_AppMain.pyp

重新编译MAC上的UI布局XML来解决此问题

在比较MAC和Windows之间的已编译UI布局类之后,唯一的区别是在Max OS X上创建了没有QMenuBar参数的新MainWindow对象。