Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt Mac多菜单栏/可修改菜单栏_Qt_Macos_Menubar - Fatal编程技术网

Qt Mac多菜单栏/可修改菜单栏

Qt Mac多菜单栏/可修改菜单栏,qt,macos,menubar,Qt,Macos,Menubar,我有一个显示多个子面板的应用程序&客户机希望为每个子面板显示不同的菜单 显然,Mac应用程序每个系统窗口只能有一个菜单栏,而且它的可修改性最低(如果有的话)。我需要删除/添加或启用/禁用菜单栏上的菜单 我曾考虑过将每个子面板设置为系统窗口,并在每个子面板上附加一个菜单栏,但我没有看到任何切换到窗口菜单栏的规定。此外,我怀疑这样做会造成子面板的状态/定位混乱 我的发现 我发现,如果我作为主窗口的子窗口创建操作,我可以随意从菜单中添加和删除它们。因此,我可以修改菜单内容,但不能修改菜单栏内容 我发现

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

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

我曾考虑过将每个子面板设置为系统窗口,并在每个子面板上附加一个菜单栏,但我没有看到任何切换到窗口菜单栏的规定。此外,我怀疑这样做会造成子面板的状态/定位混乱

我的发现

我发现,如果我作为主窗口的子窗口创建操作,我可以随意从菜单中添加和删除它们。因此,我可以修改菜单内容,但不能修改菜单栏内容

我发现我还可以随时将菜单的标题更改为任何内容。因此,如果我清除内容并将标题设置为空字符串,它显然会删除菜单(尽管它仍然在那里并高亮显示)

除非有另一个解决方案,否则现在必须这样做


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

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


也可以通过制作一个合适的菜单并发送
[NSApp setmain menu:menubarReplacement]

来替换菜单栏。我正在搜索其他内容,但正如我刚才所做的一样,我所做的是

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

而且似乎效果不错。只是为了它的价值。

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

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

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

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


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

将标题设置为空字符串对于单个菜单来说是可以的,但是如果设置空字符串的菜单是多个且彼此相邻的,则会获得相当大的空间。这是一个很好的信息,但并不能真正解决实现此目的的Qt方法。然而,正如这个答案正确地指出的,你可以动态地更改你的QT应用程序中的菜单栏——我将在一个单独的答案中尝试更具体一些。稍微偏离主题。。。如果要防止在编辑菜单中添加特定于OSX的项目(假设有),请在创建QMenu时在“E”前面加一个空格。IE使用“编辑”,而不是“编辑”