2010-02-14 16 views
5

Próbuję dodać element do paska menu aplikacji prostego przykładu PyQt. Jednak poniższy kod w ogóle nie zmienia paska menu. Jedynym elementem w menu jest "Python". Poniżej znajduje się większość kodu, minus import i tworzenie instancji.Menu PyQtBar 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) 

Próbowałem zostały również stworzenie nowego QMenuBar i stosując metodę setMenuBar() ręcznie zamienią się pasek menu.

Jakiekolwiek rażące błędy w powyższym fragmencie?

Odpowiedz

3

Nie mam zainstalowanego PyQt na tym komputerze, aby to przetestować, ale myślę, że na komputerze Mac funkcja QMainWindow.menuBar() nie zwraca paska menu aplikacji.

Można spróbować tworzenia paska menu, jak:

menubar = QtGui.MenuBar() 

ja opierając to na docs dla QMainWindow.menuBar() funkcji tutaj:

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

Można również sprawdzić sekcję oznaczoną QMenuBar na Mac OS X na tej stronie:

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

Nadzieję, że pomaga!

+2

inną opcją, aby umieścić pasek menu w oknie samo jest jeśli sys.platform == „Darwin”: QtGui.qt_mac_set_native_menubar (fałsz) – levis501

+0

zainstalować PyQt4 za pomocą napar, a używanie tego kodu nadal nie spowoduje wyświetlenia paska menu w trybie ujednoliconym. Mogę pokazać pasek menu w głównym oknie aplikacji, tylko ustawiając 'self.menuBar.setNativeMenuBar (False)'. Jakieś sugestie? – swdev

+1

poprawną odpowiedzią jest tftdias poniżej –

2

Prawidłowo. W systemie Mac OS musimy użyć paska menu tak:

self.menubar = QtGui.QMenuBar() 

I nie podoba:

self.menubar = QtGui.QMenuBar(MainWindow) 

(bez parametru MainWindow)

I sugerują, że najlepszym rozwiązaniem jest użycie QTDesiner budować układ interfejsu użytkownika, a następnie narzędzie pyside-uic do konwersji na klasę Python na innej platformie. Kiedy użyłem klasy układu UI skompilowanej w systemie Windows na MAC, otrzymałem ten problem. Rozwiązać ten problem, po prostu kompilacji XML układ UI na Mac z poleceniem pyside-uic AppMain.ui -o ui_AppMain.pyp

Po porównać skompilowaną klasę układu interfejsu pomiędzy Mac i Windows Jedyną różnicą jest to, że na Max OS X nowy QMenuBar obiekt jest tworzony bez MainWindow parametru.

6

Wiem, że to pytanie jest stare, ale ponieważ utknąłem z tym samym problemem, znalazłem to, ponieważ tworzyłem akcję, aby zamknąć aplikację i ta akcja jest zarezerwowana dla OSX w menu aplikacji, menu Plik nie nie pojawiają się. Kiedy utworzyłem nową akcję w tym samym menu, stała się dostępna. To działało przy użyciu tego samego podejścia do innych systemów operacyjnych:

self.menubar = self.menuBar() 

ten został stworzony wewnątrz obiektu QMainWindow.

Mam nadzieję, że to pomoże każdemu!

+0

To była jedyna odpowiedź, która faktycznie działa. –

+0

Dobrze wiedzieć, że to było przydatne @ChrisCalloway. – tftdias

+0

Tak, to jest właściwie poprawna odpowiedź –

3

Podczas używania PyQt na komputerze mac, system przechwytuje określone polecenia zawierające słowo "Quit" lub "Exit" i usuwa je z paska menu, ponieważ istnieją one gdzie indziej. jeśli nagłówek paska menu nie zawiera żadnych elementów, nie wyświetli się, co sprawi, że będzie wyglądać tak, jakby użytkownik nie zmodyfikował paska menu.

#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) 

Ponadto, wywołanie funkcji raise_() nie zmienia paska menu na moim komputerze mac. Muszę ręcznie wybrać okno (przez kliknięcie w inne miejsce, gdzie następnie przekierowuję), jeśli używam raise_(), aby uzyskać poprawny pasek menu do pokazania dla mojej aplikacji pyqt.

Pamiętaj również, że menu w mac są wyświetlane w menu systemu, a nie w oknie, tak jak na komputerze z systemem Windows lub Linux. To prowadzi nas do innego rozwiązania, jak sugerują Levi501 i Swdev. Że jest użycie non-native menu, które pojawia się w oknie tak:

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

Jako ktoś, kto używa Windows i Linux dużo, to sprawia, że ​​o wiele więcej sensu dla moich projektów.

znalazłem „exit” informacji tutaj: http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html

+0

Wow, żaden z pozostałych nie działał, jesteś moim zbawcą! To powinna być zaakceptowana odpowiedź. Dzięki stary. –

Powiązane problemy