Qt のシグナルとスロットの原理

1. 信号とスロットの仕組みは何ですか?

  信号とスロット (Signal & Slot) は、2 つのオブジェクト間の通信に使用されます。平たく言えば、1 つのオブジェクトが信号を送信し、もう 1 つのオブジェクトが対応するアクションを実行します (たとえば、ランニング ゲームでは、審判が銃声を発します)合図とともに選手たちは走り始める)。

  シグナル(Signal):イベント通知の送信に相当します。

  スロット: スロットは実際には関数であり、信号に応答して実行される一連の命令です。

  Connect: この接続のプロセス、つまり、どのような信号でどのようなスロット機能を実行するかを指定します。

  Qt の QOBject から派生したクラスのみがシグナルとスロットをサポートします。主に 2 つのカテゴリに分かれています: 1. Qt クラスに付属しているもの、2. ユーザー定義のもの。

二、信号

  Qt に付属のシグナルについては、通常、どのシグナルがあるかを知るだけでよく、それらを直接使用できます。Qt の一般的なシグナルのいくつかは次のとおりです。

void clicked(bool checked = false)

void pressed()

void released()

void toggled(bool check)

  カスタム シグナルを使用したい場合は、まず新しいクラスを作成し、そのクラスに Qt のいくつかの標準クラスを継承させる必要があります。自分で作成したクラスが Qt のシグナル スロット メカニズムを使用したい場合は、次の条件を満たす必要があります  。 . このクラスは QObject クラスまたはそのサブクラスから派生する必要があります  2. クラスを定義するヘッダー ファイルに Q_OBJECT マクロを追加します  要件:   1. シグナルはクラスのメンバー関数です  2. 戻り値は void 型です  3.シグナルの名前は実際の状況に応じて指定できます  4. パラメーターは自由に指定でき、シグナルはオーバーロードもサポートしています void signal_test(int, int, char); 5. シグナルは  キーワードキーワードを使用して宣言する必要があります。 public などのキーワードに似ています。  6. シグナル関数 宣言するだけです  。 7. プログラム内でカスタム シグナルを送信します。シグナル送信の本質は、シグナル関数を呼び出すことです。
  
  

  
  
  
  
  
  
  

  エミット信号コードを書き留めると、この信号に接続されているスロットが呼び出されます。この呼び出しはどのように行われるのでしょうか? 一つずつ謎を解き明かしていきましょう。

  コード例を見てみましょう。

class ZMytestObj : public QObject
{
    
    
Q_OBJECT
signals:
void sigMenuClicked();
void sigBtnClicked();
};

  前処理後のコンパイラのコードは次のとおりです。


// SIGNAL 0
void ZMytestObj::sigMenuClicked()
{
    
    
QMetaObject::activate(this, &staticMetaObject, 0, 0);
}
 
// SIGNAL 1
void ZMytestObj::sigBtnClicked()
{
    
    
QMetaObject::activate(this, &staticMetaObject, 1, 0);

したがって、シグナル関数もこのように記述して定義できます。

3. スロット機能

  特徴は次のとおりです:    1. 戻り値は void です   2. パラメータが存在する可能性があります。パラメータのタイプと数は、対応する信号に対応する必要があります。パラメータの数は信号より少なくても構いませんが、それ以上にすることはできません。 void slot_test( int); および前の void signal_test (int, int, char) は次のようになります。
  
  

4. 信号スロットを接続します

  接続機能

 //QT4
 connect(m_pPushBtn, SIGNAL(clicked(bool)), &signalTest, SLOT(slots_TestSlot1()));

 //QT5
 connect(m_pPushBtn, &QPushButton::clicked, &signalTest, &CSignalTest::slots_TestSlot1);

   注:    1. シグナルは複数のスロット関数に接続できますが、   シグナルがトリガーされた後、すべてのスロット関数が呼び出されますが、呼び出し順序は不定です。
  
     

      2. スロット関数は、   信号の 1 つに接続された複数の信号によってトリガーできます。スロット関数が呼び出されます。
     

      3.connect はシグナルとシグナルを接続できます   connect(m_pPushBtn, SIGNAL(clicked(bool)), &signalTest, SIGNAL(signals_TestSignls()));
     

おすすめ

転載: blog.csdn.net/AAAA202012/article/details/130580433