[英]Multiprocessing Qt app: How can I limit it to a single icon in the MacOS/X Dock?
我有一個Qt應用程序(出於超出此問題范圍的原因)將每個窗口作為一個單獨的進程啟動。
這可以正常工作,但是在MacOS / X下,每個窗口/進程在Dock中都顯示為單獨的條目。 因此,當用戶打開十二個窗口時,Dock中會有十二個相同的圖標,這並不是很有用(因為很難分辨出哪個是哪個,並且圖標開始變小)。
是否可以通過某種方法告訴Dock將所有這些進程歸為一個Dock圖標? (Mac專用的API可以)
您可以使用以下代碼段隱藏不活動的進程的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編程指南的“使用應用程序委托動態添加菜單項”部分中找到詳細信息。
更新:
我稍稍更改了上面的代碼示例,因為先前的方法在重新激活應用程序后導致主菜單無響應。
調用QSystemTrayIcon::hide()
。
如果這不起作用,您可以嘗試以下操作:
使用NSApplication
的setActivationPolicy:
方法
方式1: [NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
方式2: [NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
要么
使用LSUIElement
(LSUIElement=1)
。
您也可以將其放在pfile中: <key>LSUIElement</key> <string>1</string>
或讓Qt 為您完成 。
在Qt論壇上也有一些關於OSX菜單的討論 。 此外,您可以嘗試使用QFocusEvent來檢查應用何時失去/獲得焦點 ,然后相應地更新菜單 。
資料來源
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.