2011-01-05 2 views
0

Ich habe eine Anwendung, die mehrere Subpanels zeigt & der Client verschiedene Menüs für jeden subpanel zeigen will.Qt Mac mehrere Menubars/modifizierbar menubar

Mac-Apps können scheinbar nur eine Menüleiste pro Systemfenster haben, und sie ist minimal modifizierbar (wenn überhaupt.) Ich muss Menüs auf der Menüleiste entfernen/hinzufügen oder aktivieren/deaktivieren.

Ich habe darüber nachgedacht, jedes der Subpanels zu einem Systemfenster zu machen und jeweils eine Menüleiste anzuhängen, aber ich sehe keine Möglichkeit, in die Menüleiste eines Fensters zu wechseln. Außerdem vermute ich, dass dadurch ein Zustand/Positionierungsfehler für die Unterpanels entstehen würde.

Was ich

ich gefunden habe, gefunden zu haben, wenn ich die Aktionen als Kinder des Hauptfensters erstellen, kann ich sich nach Belieben aus den Menüs selbst hinzufügen und entfernen. So kann ich den Inhalt des Menüs ändern, aber ich kann den Inhalt der Menüleiste nicht ändern.

Ich habe finde ich auch den Titel des Menüs etwas jederzeit ändern kann. Wenn ich also den Inhalt lösche und den Titel auf eine leere Zeichenfolge setze, hat dies den offensichtlichen Effekt, dass das Menü entfernt wird (obwohl es immer noch vorhanden ist und immer noch hervorgehoben wird).

eine andere Lösung Sperre haben, das zu tun, denn jetzt.

Ist das überhaupt möglich auf Mac? Wenn ich in Cocoa (weiß nicht Cocoa) gehen würde, könnte ich vielleicht mehrere Menüleisten einrichten, oder zumindest die Menüleiste ändern, wenn sich der Subpanel ändert?

+0

Setzen Sie den Titel auf eine leere Zeichenfolge ist ok für vielleicht ein einzelnes Menü, aber wenn Menüs die Einstellung der leeren Zeichenfolge sind mehrere und nebeneinander, Sie erhalten einen ziemlich großen Platz. – rickb

Antwort

0

Ein Cocoa-Anwendung hat nur ein menubar aktiv zu einem bestimmten Zeitpunkt, und Sie können es ändern, und ersetzen. Der folgende (Cocoa) -Code fügt beispielsweise ein neues Menü (mit drei Elementen) zur Menüleiste hinzu. Es ist auch möglich, Menüs und Menüeinträge zu bearbeiten und zu entfernen.

NSMenu *menubar = [NSApp mainMenu]; 

NSMenuItem *newBarMenuItem = [[[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""] autorelease]; 
NSMenu *newMenu = [[[NSMenu alloc] initWithTitle:@"New Menu"] autorelease]; 

NSMenuItem *menuItem1 = [[[NSMenuItem alloc] initWithTitle:@"Action 1" action:@selector(action1:) keyEquivalent:@""] autorelease]; 
NSMenuItem *menuItem2 = [[[NSMenuItem alloc] initWithTitle:@"Action 2" action:@selector(action2:) keyEquivalent:@""] autorelease]; 

[newMenu addItem:menuItem1]; 
[newMenu addItem:[NSMenuItem separatorItem]]; 
[newMenu addItem:menuItem2]; 

[menubar addItem:newBarMenuItem]; 
[menubar setSubmenu:newMenu forItem:newBarMenuItem]; 

[NSApp mainMenu] kehrt das Anwendungsmenü zurück. Ein neuer Menüeintrag wird dem Hauptmenü/der Menüleiste hinzugefügt, der ein Untermenü darstellt, das drei Elemente enthält, von denen eines ein Trennzeichen ist.

menu

Es ist auch möglich, die Menüleiste zu ersetzen durch ein entsprechendes Menü Crafting und Senden [NSApp setMainMenu:menubarReplacement].

+0

Tolle Infos. Danke !! – rickb

+1

Diese Antwort ist eine gute Information, behandelt aber nicht den Qt-Ansatz, um dies zu tun. Wie diese Antwort jedoch richtig zeigt, können Sie die Menüleiste in Ihrer QT-App dynamisch ändern - ich werde versuchen, in einer separaten Antwort genauer zu sein. – Dave

2

Ich war auf der Suche etwas anderes, aber so genau habe ich nur diese eine gearbeitet, was ich tue, ist

- delete the current menuBar if there's one 
- menuBar=new QMenuBar(0); 
- menuBar->setNativeMenuBar(true); 

Und es scheint gut zu funktionieren. Nur für das, was es wert ist.

0

Ja, das ist in einer Qt-App möglich und ziemlich verbreitet. :)

In der App werden Sie wahrscheinlich Code haben Ihre Menüs zu bauen, und installieren Sie sie in der Menüleiste (mit QMenuBar) an erster Stelle. Wie Juan richtig ausführt, können Sie zum Ändern der Menüleiste diese Instanz löschen und eine neue Menüleiste und ihre Menüs nach Bedarf neu erstellen.

In meinem eigenen Code, ich meine ursprüngliche QMenuBar halten gleich um, und QMenuBar nennen :: clear() auf der Instanz. Dies ist eine Alternative zu der von Juan empfohlenen Delete/Re-Instantiate, obwohl beide Ansätze wahrscheinlich gültig sind. Dann bearbeite ich die Menüleiste mit den aktuell benötigten Menüs.

In der Regel wird nur die gesamte QMenuBar neu erstellt, wenn die Menüs der obersten Ebene oder der Titel eines Menüs der obersten Ebene geändert werden müssen. Meistens aktualisiere ich dynamisch die tatsächlichen Menüpunkte (QActions) und/oder ihren Zustand (wie ihr Text, ob sie aktiviert sind oder nicht, aktiviert oder nicht, usw.) innerhalb eines gegebenen Menüs.

Um nur den Inhalt eines einzelnen Menüs dynamisch zu regenerieren, können Sie einen Methoden-Callback mit dem aboutToShow-Signal von QMenu verbinden und die Elemente des Menüs innerhalb dieses Callbacks dynamisch wiederherstellen (vergessen Sie nicht, mit QMenu :: clear() on zu beginnen) Die Instanz oder Sie können mit doppelten Elementen im Menü enden!). Wenn das QMenu erscheint, werden Ihre dynamisch neu erstellten Objekte/Zustände angezeigt. Diese Methode funktioniert auch für die dynamische Regenerierung von Popup-/Kontextmenüs.

+0

Etwas außerhalb des Themas ... Wenn Sie das Hinzufügen von OSX-spezifischen Elementen in Ihrem Bearbeiten-Menü verhindern möchten (vorausgesetzt, Sie haben eines), setzen Sie beim Erstellen des QMenu ein Leerzeichen vor das 'E'. IE benutze "Edit", anstatt "Edit" – Dave