2010-02-14 165 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