信号とスロットのメカニズム
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を参照してください。