2010-02-14 163 views
5

我正在尝试添加一个项目到一个简单的PyQt示例的应用程序菜单栏。但是,下面的代码似乎根本不会改变菜单栏。菜单中唯一的项目是“Python”。以下是大部分代码,减去导入和实例。PyQt MenuBar Mac OSX Snow Leopard

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()方法手动换出的菜单栏。

以上代码段中的任何明显的错误?

回答

3

我没有这台机器上安装PyQt的测试了这一点,但我想在Mac上QMainWindow.menuBar()函数不返回应用广泛的菜单栏。

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

menubar = QtGui.MenuBar() 

我的文档此基础为QMainWindow.menuBar()功能在这里:

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

您还可以检查出标记的部分Mac OS X上的QMenuBar本页面:

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

希望有帮助!

+2

另一种选择,把菜单栏的窗口本身如果sys.platform ==“达尔文”:QtGui.qt_mac_set_native_menubar(假) – levis501 2013-11-25 00:19:40

+0

我使用安装PyQt4的brew,并且使用此代码仍然不会以统一模式显示我的菜单栏。我可以通过设置'self.menuBar.setNativeMenuBar(False)'将菜单栏显示在应用程序主窗口中。任何建议? – swdev 2014-02-20 09:29:32

+1

正确的答案是由tftdias低于 – 2014-06-17 21:58:52

2

正确。在Mac OS,我们需要使用菜单栏是这样的:

self.menubar = QtGui.QMenuBar() 

,而不是像这样:

self.menubar = QtGui.QMenuBar(MainWindow) 

(不MainWindow参数)

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

后,我比较Mac和Windows之间的编译UI布局类唯一的区别是,在Max OS X是不MainWindow参数创建新QMenuBar对象解决了这个问题。

6

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

self.menubar = self.menuBar() 

这是一个QMainWindow的对象内部创建的。

希望这有助于任何人!

+0

这是唯一的答案,实际工作。 – 2014-04-11 20:15:44

+0

很高兴知道这很有用@ChrisCalloway。 – tftdias 2014-04-14 14:38:29

+0

是的,这实际上是正确的答案 – 2014-06-17 21:55:20

3

当在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了很多,这使得很多更有意义为我的项目。

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

+0

哇,其他人都没有工作,你是我的救星!这应该是被接受的答案。谢了哥们。 – 2015-07-06 11:33:51