2009-11-14 4 views
18

は:Qt:イベントは順番に処理されますか?私はその機能の一つがないクラスA、持っていた場合

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

は、クラスBはsecond_signalに2つのスロット、first_signalに接続された1つ、およびその他を有すると仮定すると、それはがことが保証されfirst_signalに接続されているスロットは、の前に常にと処理されます。second_signalスロット?

答えて

15

信号とスロット(Qt :: DirectConnection)間の直接接続タイプを使用する場合、答えは「はい」です。 Qtのヘルプ・システムから

信号が放出される、それに接続されているスロット は、通常、普通の の関数呼び出しのように、直ちに 実行されます。この場合、 シグナルとスロットのメカニズムは、GUIイベントループとは無関係に、完全に です。 スロットが返された後に、 emit文の次のコードが実行されます。キューを使用している場合は の状況が若干異なります 接続。そのような場合、emitキーワードの後のコード はすぐに になり、スロット は後で実行されます。

デフォルトの接続タイプは、 QObject::connectのいずれかの方法で変更できます。

+1

デフォルトではなくても、同じタイプのものであれば保証されると思います。キューに入れられたイベントは、それぞれが同じ優先順位を持つ2つのイベントを作成し、それらのイベントは順番に処理されます。また、デフォルトの接続タイプはQt :: AutoConnectionです。これは、エミッタとレシーバの両方が同じスレッド内にある限り、直接的に解決されます。 –

+3

投稿の頭文字は '信号とスロット間の直接接続タイプを使用している場合'を読んでください。デフォルトの型は 'Qt :: AutoConnection'であるため、送信コードと受信オブジェクトが異なるスレッドに存在するかどうかによって動作が異なります。 ['Qt :: ConnectionType's docs](http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum)と[スレッド、イベントとQObjects](http:// qt- project.org/wiki/Threads_Events_QObjects)を参照してください。 – Hossein

+2

Qt :: QueuedConnection(またはQt :: AutoConnectionを選択し、そのスロットが信号とは別のスレッドにある)を選択した場合、スロットは非同期に呼び出されますが、疑問はまだ残っていると思います。「スロットfirst_signalに接続されているのは、second_signalスロットの前に常に処理されますか?誰でも答えがありますか? –

関連する問題