2009-11-14 131 views
18

如果我有一類A,其中其功能之一的作用:Qt:事件是否按順序處理?

void A::func() 
{ 
    emit first_signal(); 
    emit second_signal(); 
} 

假設B類有2個插槽,一個連接到first_signal,另一個到second_signal,是它保證,所述插槽連接到first_signal將始終處理之前插槽second_signal

回答

15

如果你使用信號和插槽之間的直接連接類型(Qt :: DirectConnection),那麼答案是肯定的。

從Qt的幫助系統:

當一個信號被髮射時,與它相連的槽 通常執行 立即,就像一個正常 函數調用。發生這種情況時,信號和插槽機制完全是獨立於任何GUI事件循環的 。 一旦所有 插槽已返回,將執行 發出語句後面的代碼。當使用排隊的 連接時,情況是 略有不同;在這種情況下,發射關鍵字後面的代碼 將立即繼續,並且 將在稍後執行。

您可以在QObject::connect方法中將默認連接類型更改爲enum Qt::ConnectionType中的任何一個。

+1

我認爲,只要它們具有相同的類型,即使它不是默認值,也會得到保證。排隊的人會創建兩個事件,每個事件具有相同的優先級,然後按順序處理這些事件。此外,默認的連接類型是Qt :: AutoConnection,只要發射器和接收器都在同一個線程中,就可以解析爲直接連接。 – 2009-11-14 14:03:49

+3

你的帖子的開始句應該是'如果你在信號和插槽之間使用DIRECT連接類型;因爲默認類型是'Qt :: AutoConnection',它的行爲有所不同,取決於發送代碼和接收對象是否存在於不同的線程中。參見['Qt :: ConnectionType'文檔](http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum)和[Threads,Events and QObjects](http:// qt- project.org/wiki/Threads_Events_QObjects)。 – Hossein 2013-05-10 07:01:17

+2

如果您選擇Qt :: QueuedConnection(或Qt :: AutoConnection,並且該插槽與信號處於不同的線程中),當然該插槽將被異步調用,但我認爲問題依然存在:「是否保證插槽連接到first_signal的數據將始終在second_signal插槽之前處理?「任何人都有答案? – 2016-01-15 10:45:23

相關問題