2011-03-13 56 views
3
創建托盤圖標

裏面居然是我的代碼本身沒有問題,但如果我加入我的程序在啓動時運行(即每次用戶登錄),它不能創建托盤圖標,因爲在嘗試時,任務欄尚未完全創建/初始化。有沒有解決方案?現在我正在考慮像10秒間隔重試10次。Qt的應用程序出現故障時,它在啓動時運行

+0

你定位的是什麼樣的OS /桌面環境? – GreyCat 2011-03-13 16:36:57

+0

這個問題發生在Ubuntu Linux上。 – sashoalm 2011-03-13 16:49:39

回答

4

這當然是一個競爭狀態。是的,重試是一個好主意,但是我會延遲做。啓動應用程序,但在嘗試連接任務欄之前使用QTimer :: singleShot()延遲5秒鐘(或其他)。如果您想在此之後重試(這可能是一個好主意),延遲時間會更長(因爲重試將會發生得太快),因爲立即重試可能不會成功。

2

報價從http://developer.qt.nokia.com/doc/qt-4.8/qsystemtrayicon.html(注重第二款):

「要檢查系統托盤是否存在在用戶的桌面上,調用QSystemTrayIcon :: isSystemTrayAvailable()靜態函數。」 ...

「如果在構建系統托盤圖標但稍後可用時系統托盤不可用,QSystemTrayIcon將自動爲應用程序在系統托盤中添加條目(如果圖標可見)。」

+2

聽起來好像它是一個錯誤,然後至少在Ubuntu 12.04和12.10它不會「自動如果圖標是可見加在系統托盤中的應用程序中的條目」 - 至少在我的應用程序,它是系統托盤目前唯一因此在啓動時加載時無法與它進行交互。 – Thor84no 2012-11-19 12:29:46

+0

這確實是一個[bug](https://bugreports.qt.io/browse/QTBUG-61898)。請參閱[我的回答](https://stackoverflow.com/a/45043948/4653485)。 – 2017-07-11 20:30:49

1

Moca是正確的,它應該按照該文檔工作。但是,這不是由於Qt中的bug 61898

一種解決方法是等待系統托盤可用使用isSystemTrayAvailable()對。由於Wes Hardaker suggests,您可以每隔幾秒使用QTimer::singleShot()進行嘗試,直到系統托盤可用。

請注意,如果您的托盤圖標一旦系統托盤可用,即使刪除了系統托盤並創建了一個新托盤圖標(如文檔所述),它仍將始終顯示,因此您只需要第一次就做對了。

我使用PyQt5,我更換

self.show() 

self._show_when_systray_available() 

def _show_when_systray_available(self): 
    """Show status icon when system tray is available 

    If available, show icon, otherwise, set a timer to check back later. 
    This is a workaround for https://bugreports.qt.io/browse/QTBUG-61898 
    """ 
    if self.isSystemTrayAvailable(): 
     self.show() 
    else: 
     QtCore.QTimer.singleShot(1000, self._show_when_systray_available) 

我只能看到一個(件不可思議的事)不案例:在系統托盤中取出的競爭條件isSystemTrayAvailable()返回true之後以及狀態圖標顯示之前的少量時間。

相關問題