我有一个显示多个子面板的应用程序&客户希望为每个子面板显示不同的菜单。
Mac应用程序每个系统窗口只能有一个menuBar,显然,它可以进行最低限度的修改(如果有的话)。我需要在菜单栏上删除/添加或启用/禁用菜单。
我已经考虑过将每个子面板作为一个系统窗口并将菜单栏连接到每个子面板,但是我没有看到任何切换到窗口菜单栏的规定。此外,我怀疑这样做会导致子面板的状态/定位混乱。
我发现了什么
我发现如果我将操作创建为主窗口的子项,我可以从菜单本身随意添加和删除它们。所以,我可以修改菜单内容,但我无法修改菜单栏内容。
我发现我也可以随时将菜单标题更改为任何内容。因此,如果我清除内容并将标题设置为空字符串,则显示删除菜单的明显效果(尽管它仍然存在且仍然突出显示)。
除非另有解决方案,否则必须这样做。
这在Mac上是否可行?如果我进入Cocoa(不知道Cocoa),我可以设置多个菜单栏,或者至少在子面板更改时修改菜单栏吗?
答案 0 :(得分:2)
我正在寻找别的东西,但正如我刚刚开始研究这个,我所做的就是
- delete the current menuBar if there's one
- menuBar=new QMenuBar(0);
- menuBar->setNativeMenuBar(true);
似乎工作正常。只是为了它的价值。
答案 1 :(得分:0)
Cocoa应用程序在任何给定时间只有一个菜单栏处于活动状态,您可以修改并替换它。例如,下面的(Cocoa)代码将一个新菜单(带有三个项目)添加到菜单栏。也可以编辑和删除菜单以及菜单项。
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]
返回应用程序菜单。主菜单/菜单栏中添加了一个新菜单项,表示包含三个项目的子菜单,其中一个是分隔符。
也可以通过制作适当的菜单并发送[NSApp setMainMenu:menubarReplacement]
来替换菜单栏。
答案 2 :(得分:0)
是的,这在Qt应用程序中是可行的,并且相当常见。 :)
在您的应用中,您可能拥有构建菜单的代码,并首先将它们安装到菜单栏(使用QMenuBar)。正如Juan正确指出的那样,要更改菜单栏,您可以删除该实例并根据需要重新生成新的菜单栏及其菜单。
在我自己的代码中,我只保留原来的QMenuBar,并在实例上调用QMenuBar :: clear()。这是Juan推荐的删除/重新实例化的替代方法,尽管这两种方法都可能有效。然后我用当前需要的菜单重新填充菜单栏。
我通常只在顶级菜单集或顶级菜单标题需要更改时才重建整个QMenuBar。更常见的是,我在给定菜单中动态地重新生成实际菜单项(QActions)和/或它们的状态(如它们的文本,无论是否启用,检查或不检查等)。
要仅动态重新生成单个菜单的内容,您可以将方法回调连接到该特定QMenu的aboutToShow信号,并在该回调中动态重建菜单项(不要忘记在QMenu :: clear()上开始实例或您最终可能会在菜单中出现重复的项目!)。当QMenu弹出时,它将显示您动态重建的项目/状态。此方法也适用于弹出/上下文菜单的动态重新生成。