簡體   English   中英

多重處理Qt應用程序:如何將其限制為MacOS / X Dock中的單個圖標?

[英]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()

如果這不起作用,您可以嘗試以下操作:


使用NSApplicationsetActivationPolicy:方法

方式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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM