0

我有一个显示多个子面板的应用程序,客户希望为每个子面板显示不同的菜单。

显然,Mac 应用程序每个系统窗口只能有一个 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

是的,这在 Qt 应用程序中是可能的,而且相当普遍。:)

在您的应用程序中,您可能具有构建菜单的代码,并首先将它们安装到菜单栏中(使用 QMenuBar)。正如 Juan 正确指出的那样,要更改菜单栏,您可以删除该实例并根据需要重新生成新的菜单栏及其菜单。

在我自己的代码中,我只是保留了我原来的 QMenuBar,并在实例上调用 QMenuBar::clear() 。这是 Juan 建议的删除/重新实例化的替代方法,尽管这两种方法都可能有效。然后我用当前需要的菜单重新填充菜单栏。

我通常只在顶级菜单集或顶级菜单的标题需要更改时重建整个 QMenuBar。更常见的是,我在给定菜单中动态地重新生成实际的菜单项(QActions)和/或它们的状态(比如它们的文本,它们是否启用、检查与否等)。

要仅动态重新生成单个菜单的内容,您可以将方法回调连接到该特定 QMenu 的 aboutToShow 信号,并在该回调中动态重建菜单项(不要忘记在实例上以 QMenu::clear() 开头,或者您最终可能会在菜单中出现重复的项目!)。当 QMenu 弹出时,它将显示您动态重建的项目/状态。此方法也适用于弹出/上下文菜单的动态重新生成。

于 2014-03-22T02:58:04.710 回答
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]

于 2011-01-06T01:58:36.060 回答