2010-06-13 91 views
1

我已經在不同於主線程的線程中創建了Qt樹控件(及其節點)。在主線程中,我想顯示點擊節點的上下文菜單,因此我將菜單中的操作與主線程中的適當插槽相連接。 connect函數返回true,但插槽永遠不會執行。如果我在連接函數中明確指出這是Qt :: DirectConnection,那麼一切正常。爲什麼是這樣 ?Qt直接連接

我在主線程中創建我的樹,一切都正常工作,而不必說這是Qt :: DirectConnection。

+0

您是否收到任何錯誤?也許像'QObject :: connect:無法排隊類型...'的參數? – Job 2010-06-13 10:39:11

+0

不,我沒有得到任何錯誤,只是沒有輸入插槽,如果我不指定Qt :: DirectConnection。我只是想知道爲什麼我必須指定要輸入的插槽的Qt :: DirectConnection – user152508 2010-06-13 10:42:43

+2

這只是一個猜測:我認爲你應該在線程中運行一個事件循環,以便能夠使用排隊連接。你用'exec()'開始了嗎? – Job 2010-06-13 10:49:09

回答

4

請參閱文檔here

如果信號從與接收器插槽相同的線程發送,則默認連接類型Qt :: AutoConnection與Qt :: DirectConnection相同,否則其行爲與Qt :: QueuedConnection相同。

在主線程中創建小部件的情況下,基本上會獲得與您明確指定Qt :: DirectConnection時相同的行爲。

Qt :: QueuedConnection的行爲是在線程事件循環重新獲得控制權時調用槽。

爲了解決您的問題,請確保您在每個可能接收信號的線程中都有一個事件循環,除非您手動指定Qt :: DirectConnection(我認爲這將意味着該插槽將與相同的線程信號發射器 - 基本上等同於正常的函數調用)。

+0

好吧,我想我現在明白了。因爲我是從主線程發出信號,並且樹控件是在其他線程中創建的,所以默認情況下我得到了QueuedConnection。所以,爲了讓插槽在主線程中執行(在我發射的同一線程中),我必須指定Qt :: DirectConnection – user152508 2010-06-13 11:18:00