2017-05-31 40 views
0

早上好托盤,在我的MacOSX上的應用程序,我想給用戶選擇「最小化到托盤」。我用QT5,我改寫了最小化到MacOSX上

changeEvent(QEvent *event) 

功能。在那裏,我做這樣的事情

switch(event->type()) 
{ 
case QEvent::WindowStateChange: 
    { 
     if (this->windowState() & Qt::WindowMinimized) { 
      if(*option minimize to tray enable*) { 
       event->ignore(); 
       QTimer::singleShot(0, this, SLOT(hide())); 
      } 
     } 
     break; 
    } 
default: 
    break; 
} 

那麼,它可以在Linux和Windows,但問題是,在MacOSX上此代碼不能正常工作,並創建了一個錯誤。實際上,窗口在任務欄中仍然是最小化的(除了碼頭),而且,如果窗口從任務欄而不是托盤圖標調整大小,GUI將被阻止並且不會更改。 GUI仍然可以發送信號,但不能更改。我必須從托盤圖標重新顯示窗口以解除對GUI的阻止。

接下來的問題:我如何才能避免,儘量減少在MacOSX上的任務欄上的窗口?

另一個相關的問題:我已經閱讀了一些論壇,其中一些用戶在MacOSX中談論「標準行爲」,例如當單擊「x」按鈕時不關閉應用程序,或者不使用托盤圖標ecc 。 ecc ....有人可以發佈官方鏈接應用程序應該如何在MacOSX中表現?

非常感謝大家

回答

1

好了,我不知道Qt的,但我知道可可相當不錯。就Objective-C API而言,您的hide()調用可能與-orderOut:等效。不幸的是,-orderOut:無法正常工作,以最小化窗口。它在Dock中留下了一個「鬼魂」窗口,它可以不被最小化爲一個真正的鬼窗口。也就是說,這只是窗口的圖像,並不是實際的實時窗口。

它的工作叫-close。我不知道Qt等值是什麼。不過,您必須小心避免-close超出-orderOut:的一些次要結果。例如,一些窗口被設置爲在關閉時自行釋放,您希望禁用該窗口。此外,窗口代理的-windowWillClose:方法將被調用,它不應該爲不真正關閉的調用做任何事情。

別擔心,「關閉」比「隱藏」或「訂購了」更嚴重的還是永久的。除了上面提到的額外後果之外,這是非常相同的事情。例如,它仍然有可能重新顯示的被關閉的窗口等

的問題是,它的Qt讓您可以靈活地做到這一點。或者,這可以被認爲是Qt中的一個錯誤,它的hide()實現在最小化窗口上使用-orderOut:而不是-close

最後,我會問你是否真的要實現此功能。這會混淆用戶。當你最小化一個窗口時,它將最小化動畫化爲Dock。這給用戶強烈的印象,在哪裏可以找到窗口。如果隨後沒有找到該窗口,用戶將不會知道在別處尋找。同樣,Exposé/ Mission Control除了顯示正常的窗口外,還向用戶顯示應用程序的最小化窗口。你所謂的最小化到托盤的窗口不會顯示在那裏,因爲它們不再真正被最小化。

也許只是禁用最小化。讓用戶在完成後簡單地關閉窗口,並從狀態項目菜單中重新打開窗口。

+0

嗯感謝您的評論。奇怪的是,該應用程序還有一個「接近托盤」選項,它運行良好。但我使用相同的Qt函數「hide()」。我將調查你對close和orderOut之間的區別。謝謝。 – n3mo

+0

那麼,如果'hide()'是'-orderOut:'的一個包裝,那麼對於「接近托盤」,這將工作得很好。正如我所說,'-close'和'-orderOut:'除了幾個角落案例外真的非常相似。據推測,窗口在「接近托盤」的情況下並未最小化,所以這些差異之一是不相關的。 –