0

複数のサブパネルを表示するアプリケーションがあり、クライアントはサブパネルごとに異なるメニューを表示したいと考えています。

Mac アプリは、システム ウィンドウごとに 1 つの menuBar しか持てないようです。また、最小限の変更しかできません (もしあったとしても)。メニューバーのメニューを削除/追加するか、有効/無効にする必要があります。

各サブパネルをシステム ウィンドウにして、それぞれにメニューバーを追加することを考えましたが、ウィンドウのメニューバーに切り替えるための規定が見当たりません。その上、そうするとサブパネルの状態/配置が混乱するのではないかと思います。

私が見つけたもの

アクションをメイン ウィンドウの子として作成すると、メニュー自体から自由に追加および削除できることがわかりました。そのため、メニューの内容は変更できますが、メニューバーの内容は変更できません。

メニューのタイトルをいつでも任意に変更できることもわかりました。そのため、コンテンツをクリアしてタイトルを空の文字列に設定すると、メニューが削除されたように見えます (ただし、メニューはまだ存在し、ハイライト表示されています)。

別の解決策がなければ、今のところそうしなければなりません。

これはMacでまったく可能ですか?Cocoa (Cocoa を知らない) を使用した場合、複数のメニューバーを設定したり、少なくともサブパネルが変更されたときにメニューバーを変更したりできますか?

4

3 に答える 3

2

私は何か他のものを探していましたが、正確にはこれを作業していたので、私がしていることは

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

そして、それはうまくいくようです。それだけの価値があります。

于 2011-05-06T09:19:26.533 に答える
0

Yes, this is possible in a Qt app, and fairly common. :)

In your app you probably have code to build your menus, and install them into the menubar (using QMenuBar) in the first place. As Juan correctly points out, to alter the menu bar, you can delete that instance and regenerate a new menubar and its menus as needed.

In my own code, I just keep my original QMenuBar around, and call QMenuBar::clear() on the instance. This is an alternative to the delete/re-instantiate that Juan recommends, although either approach is likely valid. Then I repopulate the menubar with the currently needed menus.

I typically only rebuild the whole QMenuBar when the set of top-level menus, or the title of a top-level menu needs to change. More commonly, I am dynamically regenerating the actual menu items (QActions) and/or their state (like their text, whether they are enabled or not, checked or not, etc) within a given menu.

単一のメニューのコンテンツのみを動的に再生成するには、メソッド コールバックをその特定の QMenu の aboutToShow シグナルに接続し、そのコールバック内でメニューの項目を動的に再構築します (インスタンスまたはユーザーで QMenu::clear() で開始することを忘れないでください)。メニューに項目が重複する可能性があります!)。QMenu がポップアップすると、動的に再構築されたアイテム/状態が表示されます。この方法は、ポップアップ/コンテキスト メニューの動的再生成にも機能します。

于 2014-03-22T02:58:04.710 に答える
0

Cocoa アプリケーションでは、常にアクティブなメニューバーが 1 つだけあり、それを変更して置き換えることができます。たとえば、以下の (Cocoa) コードは、新しいメニュー (3 つの項目を含む) をメニューバーに追加します。メニュー項目だけでなく、メニューの編集や削除も可能です。

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]アプリケーション メニューを返します。新しいメニュー項目がメイン メニュー/メニューバーに追加されます。これは、3 つの項目を含むサブメニューを表し、そのうちの 1 つはセパレーターです。

メニュー

適切なメニューを作成して送信することで、メニューバーを置き換えることも可能[NSApp setMainMenu:menubarReplacement]です。

于 2011-01-06T01:58:36.060 に答える