2012-05-08 34 views
0

我試圖這樣做使我的QSystemTrayIcon類單獨的線程級以下如何使QSystemTrayIcon類到一個單獨的線程類

  1. 派生我的任務欄圖標類從QThread的
  2. 實現的run()方法在TrayIcon的類
  3. 移動的TrayIcon初始化代碼從主運行方法

呼叫TryIcon.start()。

但是我的應用程序在執行TrayIcon類中的「connect」語句時崩潰。連接語句用於trayIcon菜單功能。

我想了解QThread,通過閱讀QT文檔,例子來連接功能。

+1

GUI的東西必須留在GUI(主)線程上。你爲什麼試圖把托盤圖標處理放在單獨的線程上?這聽起來不合適。 – Mat

+0

這是一個重複/相關的問題。見http://stackoverflow.com/questions/638251/how-to-emit-cross-thread-signal-in-qt –

回答

0

你不能那樣做。所有的GUI代碼都必須駐留在GUI線程中。如果你願意,你可以在一個單獨的QObject中實現托盤圖標行爲的耗時方面。然後將該QObject移至單獨的線程,並通過信號/插槽連接(不是直接插槽調用!)或發佈事件從GUI線程與它通信。直接調用slot是毫無意義的:slot代碼將在調用線程中執行,這不是你想要的。

如果你想使生活更輕鬆,你可以暴露你的QObject的便利插槽。這些只是連接到實際工作的受保護或專用插槽。您將在QObject的構造函數中建立此連接,並且它必須是QueuedConnection。然後您可以直接調用便捷插槽:在幕後,Qt會將參數編組並將它們作爲事件放入QObject所在線程的事件隊列中。該線程中的事件循環會從隊列中選取它們,然後將調用調度到在您的QObject中工作的插槽。