QTのシグナルおよびスロット機能

信号とスロットのメカニズム
1コンセプト
    信号とスロットは、オブジェクト間の相互作用を実現するためにQtで定義された通信メカニズムです。オブジェクトが変更されると、信号が送信されます。この信号は他のオブジェクトで受信できます。指定したメンバー関数(スロット関数)が実行されます。

イラスト:

2定義
1)シグナルまたはスロットを含むクラスはQObjectのサブクラスである必要があります
2)シグナルは "signals:"でマークされ、シグナル関数は宣言するだけでよく、定義を書き込むことはできません
3)スロットは "public Slots:"でマークされ、スロット関数は特定の信号が接続を確立し、特定の信号を介してスロット関数の実行をトリガーします。さらに、スロット関数は通常のメンバー関数としても使用でき、直接呼び出されます
4)信号またはスロットを含むクラス、マクロ「Q_OBJECT」を前に追加する必要があり、プロジェクトは将来ビルドされます、moc(メタオブジェクトコンパイラ)を呼び出して、構文拡張の信号またはスロットを標準のC ++コードに復元します。

コード実装形式:
      クラスXX:public QObject {
          Q_OBJECT // moc
      シグナル:
          void sigFunc(void); //シグナル関数
      public
          Slots void slotFunc(void){...} //スロット関数
      };    


3シグナルとスロットの接続
  QObject :: connect(
      const QObject * sender、//シグナル送信オブジェクトは、すべてのQObjectサブクラスタイプにすることができます 
      const char * signal、//シグナル関数
      const QObject * receiver、//シグナル受信オブジェクト、can QObjectすべてのサブクラスタイプ
      const char * method); //スロット関数


  :    
      SIGNAL(シグナル関数(パラメーターテーブル))//シグナル関数をconst char *
      SLOT(スロット関数(パラメーターテーブル))に変換します//スロット関数をconst char *に変換し
ます* ケース:以下を含むQtアプリケーションを作成します1つのラベルと1つのボタン。ボタンをクリックしてラベルを閉じます。

4信号とスロットの接続構文の要件
1)信号とスロットのパラメーターは一貫している必要があります
    QObject :: connect(A、SIGNAL(sigFunc(int))、B、SLOT(slotFunc(int))); // ok
    QObject :: connect( A、SIGNAL(sigFunc(void))、B、SLOT(slotFunc(int))); //エラー

 古いバージョンのQtでのスロット関数の実装:

     connect(A、SIGNAL(sigFunc(int))、B、SLOT(slotFunc(int)));

 Qtの新しいバージョンでのスロット関数の実装:

     connect(A、Signal1、B、Slot1);

古いバージョンのスロット関数関数の特性:パラメーター利点 は直感的であり、欠点は型の検出ではないため、使用することはお勧めしません  


2)デフォルトパラメータを運ぶことができる
    クラスB {
        Q_OBJECT
    パブリックスロット:
        void slotFunc(int i = 0){}
    };
    QObject :: connect(A、SIGNAL(sigFunc(void))、B、SLOT(slotFunc(void) )); // ok
3)シグナル関数のパラメーターはスロット関数のパラメーターより大きくても     かまいません。超過したパラメーターは無視され、その    逆は不可能です
QObject :: connect(A、SIGNAL(sigFunc(int))、B、SLOT(slotFunc(void ))); // ok
4)信号を複数のスロット関数に接続できます(1対多)
    QObject :: connect(A、SIGNAL(sigFunc(int))、B1、SLOT(slotFunc1(int))); / / ok
    QObject :: connect(A、SIGNAL(sigFunc(int))、B2、SLOT(slotFunc2(int))); // OK
    注:Aオブジェクトが設定を送信すると、B1とB2のスロット関数が実行されます
5)複数の信号を同じスロット関数に同時に接続できます(多対1)
    QObject :: connect(A1、SIGNAL(sigFunc1(int))、B、SLOT(slotFunc(int))); // ok
    QObject :: connect(A2、SIGNAL(sigFunc2(int))、B、SLOT(slotFunc(int))); // ok
    注:A1またはA2がシグナルを送信しても、Bのスロット関数が実行されます
6)2つのシグナル関数は直接接続できます(直列信号) //
    QObjectを理解します:: connect(A1、SIGNAL(sigFunc1(int))、A2、SIGNAL(sigFunc2(int))); // OK
    注:A1が信号を送信すると、接続されますA2オブジェクトのシグナルも送信されます。

 

スロット関数を適用する場合、ラムダ式も何度も使用されます。

ラムダ式:無名関数オブジェクトを定義および作成するために使用されます。

Lambdaの構文は次のとおりです。

              [関数オブジェクトパラメータ](演算子オーバーロード関数パラメータ)可変 または例外宣言->戻り値の型{関数本体}

              []ラムダ式です。渡す方法を選択してください

             [](){Btn-> settext( "aaaa");};

            1、値の転送

             [=](){Btn-> settext( "aaaa");};

            2、アドレス転送

             [&](){Btn-> settext( "aaaa");};

特定の使用法については、Baiduを参照してください。

元の記事9件を公開 賞賛された6件 1996年の訪問

おすすめ

転載: blog.csdn.net/GG802312/article/details/105416807