2011-01-05 233 views
0

我有一个显示多个子面板的应用程序&客户端想要为每个子面板显示不同的菜单。Qt Mac多个菜单栏/可修改的菜单栏

显然,Mac应用程序每个系统窗口只能有一个menuBar,并且它是最小可修改的(如果有的话)。我需要在菜单栏上删除/添加或启用/禁用菜单。

我想过让每个子面板成为一个系统窗口并为每个子面板附上一个菜单栏,但是我没有看到任何切换到窗口菜单栏的规定。此外,我怀疑这样做会导致子面板的状态/定位混乱。

我学到了什么

我发现,如果我创建的行动作为主窗口的孩子,我可以添加和随意从菜单中自己删除。所以,我可以修改菜单内容,但我无法修改菜单栏内容。

我发现我也可以随时将菜单的标题更改为任何内容。因此,如果我清除内容并将标题设置为空字符串,则它具有删除菜单的明显效果(尽管它仍然存在并且仍然是高亮显示)。

除了另一个解决方案,现在必须这样做。

这在Mac上可能吗?如果我进入可可(不知道可可),我是否可以设置多个菜单栏,或者至少在子面板改变时修改菜单栏?

+0

将标题设置为空字符串对于可能是单个菜单是可以的,但是如果菜单设置空串是多个并且彼此相邻,则会得到相当大的空间。 – rickb 2011-01-05 20:58:02

回答

0

可可应用程序在任何给定时间只有一个菜单栏有效,您可以修改并替换它。例如,下面的(可可)代码向菜单栏添加了一个新菜单(包含三项)。也可以编辑和删除菜单以及菜单项。

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]返回应用程序菜单。一个新的菜单项被添加到主菜单/菜单栏中,表示一个包含三个项目的子菜单,其中一个是分隔符。

menu

也可以通过制定相应的菜单和发送[NSApp setMainMenu:menubarReplacement]更换的菜单栏。

+0

伟大的信息。感谢名单! – rickb 2011-01-07 04:26:44

+1

这个答案是很好的信息,但并没有真正解决Qt方法来做到这一点。然而,正如这个答案正确指出的那样,你可以动态地改变你的QT应用程序中的菜单栏 - 我会试着在一个单独的答案中更具体。 – Dave 2014-03-22 02:31:53

2

我正在寻找别的东西,但尽可能精确我刚刚工作这一块,我做的是

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

它似乎很好地工作。只是为了它的价值。

0

是的,这是可能的一个Qt应用程序,相当普遍。 :)

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

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

当一套顶层菜单或顶层菜单的标题需要改变我通常只重建整个QMenuBar。更常见的是,我在给定的菜单中动态地重新生成实际的菜单项(QActions)和/或它们的状态(如它们的文本,无论它们是否被启用,是否被检查等)。

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

+0

稍微偏离主题...如果您想要阻止在编辑菜单中添加OSX特定项目(假设您有),请在创建QMenu时在“E”之前放置一个空格。 IE使用“编辑”而不是“编辑” – Dave 2014-03-22 03:02:37