Qtシグナルとスロットの仕組み

QT は、インターフェイス操作の応答を完了するためのシグナルおよびスロット メカニズムを提供します。シグナルおよびスロット メカニズムは、任意の 2 つの QT オブジェクト間の通信メカニズムを完了します。

シグナル (Signal)は、特定の状況下で発行されるイベントです. たとえば、PushButton の最も一般的なシグナルは、マウスがクリックされたときに発行される clicked() シグナルです. ComboBox の最も一般的なシグナルは、次のときに発行される CurrentIndexChanged() です。選択されたリスト項目が変更されます。GUI プログラミングの主な内容は、インターフェイス上のさまざまなコンポーネントの信号への応答です. どのような状況でどの信号が発せられるかを知り、これらの信号に適切に応答して処理することだけが必要です.

スロットは、シグナルに応答する機能です。スロットは関数であり、一般的な C++ 関数と同じです. クラスの任意の部分 (public、private、または protected) で定義でき、任意のパラメーターを持ち、直接呼び出すこともできます。スロット関数と一般的な関数の違いは、スロット関数は信号に関連付けることができ、信号が送信されると、関連付けられたスロット関数が自動的に実行されることです。

シグナルとスロット機構の接続方法

  • 基本フォーマット
connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2));
  • 信号は別の信号に接続できます
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal2));

Object1 のシグナル 1 の送信は、Object2 のシグナル 2 の送信をトリガーできます。

  • 同じ信号を複数のスロットに接続可能
connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2));
connect(Object1,SIGNAL(signal1),Object3,SLOT(slot3));
  • 同じスロットが複数の信号に応答可能
connect(Object2,SIGNAL(signal2),Object1,SLOT(slot1));
connect(Object3,SIGNAL(signal3),Object1,SLOT(slot1));

SIGNAL() と SLOT() は Qt によって定義された 2 つのマクロで、引数の C スタイルの文字列 (const char*) を返します。したがって、シグナルとスロットを関連付ける次の 2 つのステートメントは同等です。

connect(buttoon, SIGNAL(clicked()), this, SLOT(showArea()));
connect(buttoon, "clicked()", this, "showArea()");

シグナルとスロット機構の利点

  • タイプの安全性

関連するシグナルとスロットの署名は同一でなければなりません。つまり、シグナルのパラメーターのタイプとパラメーターの数は、シグナルを受信するスロットのパラメーターのタイプとパラメーターの数と同じでなければなりません。ただし、スロットのパラメーターの数は信号のパラメーターの数よりも少なくてもかまいませんが、不足しているパラメーターは最後の 1 つ以上の信号パラメーターでなければなりません。

  • 疎結合

シグナルとスロットのメカニズムは、QT オブジェクトの結合を弱めます。シグナルを発信するオブジェクトは、どのオブジェクトのスロットがそれに対応する必要があるかを知る必要はなく、シグナルが受信されたかどうかは気にしません。同じスロットは、どの信号がそれ自体に関連付けられているかを認識していません。シグナルとスロットが関連付けられると、Qt は適切なスロットが呼び出されるようにします。

クラスがシグナルとスロットをサポートしたい場合は、QObject または QObject のクラスから継承する必要があります。シグナルとスロットは、テンプレートの使用をサポートしていません。

シグナルとスロットのメカニズムの効率

シグナルとスロットのメカニズムは、オブジェクト間の通信の柔軟性を高めますが、パフォーマンスも低下します.主な理由は次のとおりですが、このパフォーマンスの低下は比較に値します.

  • 信号を受信して​​いるオブジェクトを見つける必要があります
  • すべての関連付けを安全にトラバースする (1 つの信号から多くのスロットへ)
  • 渡された引数のマーシャリングとアンマーシャリング
  • マルチスレッドの場合、シグナルをキューに入れる必要がある場合があります

おすすめ

転載: blog.csdn.net/m0_45463480/article/details/130439379