6

我有一个 Qt 应用程序(出于此问题范围之外的原因)将其每个窗口作为单独的进程启动。

这工作正常,但在 MacOS/X 下,每个窗口/进程在 Dock 中显示为单独的条目。因此,当用户打开十几个窗口时,Docks 中有十几个相同的图标,这不是很有帮助(因为很难分辨哪个是哪个,并且图标开始变小)。

有没有办法告诉 Dock 将所有这些进程组合在一个 Dock 图标下?(一个特定于 Mac 的 API 就可以了)

4

2 回答 2

4

您可以使用以下代码段隐藏非活动进程的 Dock 磁贴:

 - (void)applicationWillResignActive:(NSNotification *)notification
{
    ProcessSerialNumber psn = {0, kCurrentProcess};
    TransformProcessType(&psn, kProcessTransformToBackgroundApplication);
    if([self.window isVisible])
    {
        [self.window performSelector:@selector(orderFrontRegardless) withObject:nil afterDelay:0.05];
    }
}

- (void)applicationWillBecomeActive:(NSNotification *)notification
{
    ProcessSerialNumber psn = {0, kCurrentProcess};
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
    SetFrontProcessWithOptions(&psn, kSetFrontProcessCausedByUser);
}

只需将上面的代码添加到您的应用程序委托中,当进程退出活动时,应用程序的 Dock 图标就会消失。
要在进程转换为 UIElement 应用程序后保持窗口可见,请发送orderFrontRegardless消息。(我知道这很 hacky - 但这一定是非标准窗口/进程处理的代价)

可能您还应该维护一个 Dock 菜单,允许您的用户选择隐藏的窗口。
您可以从“主”应用程序中动态添加条目。详细信息可以在Dock Tile 编程指南的“使用应用程序代理动态添加菜单项”部分中找到。

更新:
我稍微更改了上面的代码示例,因为以前的方法在重新激活应用程序后导致主菜单无响应。

于 2013-06-24T08:54:05.297 回答
1

打电话QSystemTrayIcon::hide()

如果这不起作用,您可以尝试以下方法:


使用NSApplicationsetActivationPolicy:方法

方式一:[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];

方式二:[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];


或者

使用 LSUIElement (LSUIElement=1).

你也可以把它放在你的 pfile 中:<key>LSUIElement</key> <string>1</string>或者让 Qt为你做


Qt 论坛上 也有一些关于OSX 菜单的讨论。此外,您可以尝试使用QFocusEvent来检查应用何时失去/获得焦点,然后相应地更新菜单


来源

于 2013-06-18T16:41:48.230 回答