裏面居然是我的代碼本身沒有問題,但如果我加入我的程序在啓動時運行(即每次用戶登錄),它不能創建托盤圖標,因爲在嘗試時,任務欄尚未完全創建/初始化。有沒有解決方案?現在我正在考慮像10秒間隔重試10次。Qt的應用程序出現故障時,它在啓動時運行
回答
這當然是一個競爭狀態。是的,重試是一個好主意,但是我會延遲做。啓動應用程序,但在嘗試連接任務欄之前使用QTimer :: singleShot()延遲5秒鐘(或其他)。如果您想在此之後重試(這可能是一個好主意),延遲時間會更長(因爲重試將會發生得太快),因爲立即重試可能不會成功。
報價從http://developer.qt.nokia.com/doc/qt-4.8/qsystemtrayicon.html(注重第二款):
「要檢查系統托盤是否存在在用戶的桌面上,調用QSystemTrayIcon :: isSystemTrayAvailable()靜態函數。」 ...
「如果在構建系統托盤圖標但稍後可用時系統托盤不可用,QSystemTrayIcon將自動爲應用程序在系統托盤中添加條目(如果圖標可見)。」
聽起來好像它是一個錯誤,然後至少在Ubuntu 12.04和12.10它不會「自動如果圖標是可見加在系統托盤中的應用程序中的條目」 - 至少在我的應用程序,它是系統托盤目前唯一因此在啓動時加載時無法與它進行交互。 – Thor84no 2012-11-19 12:29:46
這確實是一個[bug](https://bugreports.qt.io/browse/QTBUG-61898)。請參閱[我的回答](https://stackoverflow.com/a/45043948/4653485)。 – 2017-07-11 20:30:49
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
之後以及狀態圖標顯示之前的少量時間。
- 1. 啓動電梯時出現故障
- 2. 運行仿真器時出現故障
- 3. 運行程序時發生SIGILL故障
- 4. 在啓動時運行Qt應用程序
- 5. 在啓動時運行應用程序
- 6. 在Mac上啓動Rails服務器時出現故障
- 7. Azure移動應用程序在遷移後出現故障
- 8. 運行應用程序時出現java.lang.NullPointerException
- 9. 在STM32F030啓動時的硬故障,__libc_init_array
- 10. 運行時間故障
- 11. 數據綁定菜單項,在運行時出現故障
- 12. 在iOS上運行舊項目時出現故障11
- 13. C++ MPI代碼在運行時出現故障11
- 14. CoreBluetoothFramework - 當它未運行時是否啓動IOS應用程序
- 15. Oracle存儲過程在Linux上運行時出現故障,適用於Windows
- 16. 應用程序啓動時應用程序類不運行?
- 17. 如何在Windows啓動時運行具有故障處理功能的應用程序
- 18. 分段故障時,程序退出
- 19. 如何在調試器出現故障時調試程序
- 20. 如何指定應用程序在Marathon故障轉移時的運行位置
- 21. 當我在Eclipse上運行我的應用程序作爲Spring啓動應用程序時,它會拋出org.springframework.context.ApplicationContextException?
- 22. QT Android應用程序在啓動時崩潰時添加libvlcjni.so
- 23. AsyncTask在啓動應用程序時出現奇怪的延遲
- 24. 「啓用API」按鈕出現故障/子
- 25. 在啓動時啓動應用程序
- 26. 在啓動時啓動應用程序
- 27. 如何在系統啓動時自動運行應用程序?
- 28. 當我運行它時,應用程序正在關閉?無法啓動活動?
- 29. 春季啓動應用程序時,掛在命令行運行
- 30. 在應用程序啓動時運行python-rq工作進程
你定位的是什麼樣的OS /桌面環境? – GreyCat 2011-03-13 16:36:57
這個問題發生在Ubuntu Linux上。 – sashoalm 2011-03-13 16:49:39