2010-02-14 4 views
5

Ich versuche ein Element zur Anwendungsmenüleiste eines einfachen PyQt-Beispiels hinzuzufügen. Der folgende Code scheint jedoch die Menüleiste überhaupt nicht zu verändern. Der einzige Punkt im Menü ist "Python". Im Folgenden finden Sie den Großteil des Codes, abzüglich Import und Instanziierung.PyQt MenuBar MacOSX 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) 

Ich habe auch eine neue QMenuBar und mit Hilfe der setMenuBar() Methode versucht, die Erstellung manuell über die Menüleiste tauschen.

Irgendwelche eklatanten Fehler im obigen Ausschnitt?

Antwort

3

Ich habe nicht PyQt auf diesem Rechner installiert, um dies zu testen, aber ich denke, auf einem Mac die QMainWindow.menuBar() Funktion gibt nicht die Anwendung Menüleiste zurück.

Sie könnten eine menubar wie versuchen zu schaffen:

menubar = QtGui.MenuBar() 

Ich bin stützen diese auf die Dokumentation für die QMainWindow.menuBar() Funktion hier:

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

Sie könnten auch den Abschnitt überprüfen beschriftet QMenuBar unter Mac OS X auf dieser Seite:

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

Hoffe, dass hilft!

+2

Eine weitere Möglichkeit, die Menüleiste im Fenster setzen selbst wenn sys.platform ist == "Darwin": QtGui.qt_mac_set_native_menubar (False) – levis501

+0

I PyQt4 Installation mit brauen, und die Verwendung dieses Codes zeigt meine Menüleiste immer noch nicht im Unified-Modus an. Ich kann die Menüleiste innerhalb des Hauptfensters der Anwendung anzeigen, nur indem ich 'self.menuBar.setNativeMenuBar (False)' setzt. Irgendein Vorschlag? – swdev

+1

richtige Antwort ist durch tftdias unter –

2

Korrekt. Unter Mac OS müssen wir menubar wie folgt verwenden:

self.menubar = QtGui.QMenuBar() 

Und nicht so:

self.menubar = QtGui.QMenuBar(MainWindow) 

(ohne MainWindow Parameter)

Ich schlage vor, die beste Lösung QTDesiner verwendet zu bauen Das UI-Layout verwendet dann das Tool pyside-uic zum Konvertieren in eine Python-Klasse auf einer anderen Plattform. Als ich die UI-Layout-Klasse unter Windows in MAC kompiliert habe, habe ich dieses Problem. Lösen Sie dieses Problem, indem Sie einfach die Kompilierung des UI-Layout XML auf MAC mit dem Befehl pyside-uic AppMain.ui -o ui_AppMain.pyp

Nachdem ich die kompilierte UI-Layout-Klasse zwischen MAC und Windows nur mit dem Unterschied, dass neue auf Max OS X vergleichen QMenuBar Objekt ohne MainWindow Parameter erstellt wird.

6

Ich weiß, diese Frage ist alt, aber, da ich mit dem gleichen Problem feststeckte, fand ich, dass, weil ich eine Aktion zum Beenden der Anwendung erstellt und diese Aktion auf OSX für das Anwendungsmenü reserviert ist, das Menü Datei nicht auftauchen. Als ich eine neue Aktion im selben Menü erstellte, wurde sie verfügbar. Dies funktionierte durch den gleichen Ansatz für andere Betriebssysteme verwenden:

self.menubar = self.menuBar() 

Dies wurde in einem QMainWindow Objekt erstellt.

Hoffe das hilft jedem!

+0

Dies war die einzige Antwort, die tatsächlich funktioniert. –

+0

Gut zu wissen, es war nützlich @ChrisCalloway. – tftdias

+0

Ja das ist eigentlich die richtige Antwort –

3

Wenn PyQt auf einem Mac verwendet wird, fängt das System bestimmte Befehle ab, die das Wort 'Beenden' oder 'Beenden' enthalten und entfernt sie aus Ihrer Menüleiste, weil sie woanders existieren. Wenn ein Menüleisten-Header keine Elemente enthält, wird er nicht angezeigt, so als ob Sie die Menüleiste nicht geändert hätten.

Auch Raise_() aufrufen ändert nicht die Menüleiste auf meinem Mac. Ich muss das Fenster manuell auswählen (indem ich auf "else" klicke), wenn ich raise_() verwende, um die richtige Menüleiste für meine pyqt-App anzuzeigen.

Denken Sie auch daran, dass Mac-Menüleisten in der System-Menüleiste nicht im Fenster angezeigt werden, wie auf einem Windows- oder Linux-Rechner. Dies führt uns zu der anderen Lösung, wie von Levi501 und Swdev vorgeschlagen. Das ist ein nicht-native Menü zu verwenden, wie dies im Fenster erscheint:

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

Als jemand, die Windows und Linux eine Menge verwendet, das macht viel mehr Sinn für meine Projekte.

fand ich die 'Exit' Informationen hier: http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html

+0

Wow, keiner der anderen arbeitete, du bist mein Retter! Dies sollte die akzeptierte Antwort sein. Danke Kumpel. –