lesson2-シグナルとスロットの仕組み
1. シグナルとスロットの理解
1. シグナルとスロットとは何ですか?
多くの GUI ツールでは、各ウィジェットがトリガーできるアクションに応答するコールバック関数を持っています。これらのコールバック関数は通常、特定の関数へのポインターです。ポインターは比較的面倒な概念です。Qt では、シグナルとスロットがこれらの厄介な関数ポインターを置き換え、プログラムの作成を簡素化します。
オブジェクトが変更されると、オブジェクトが行うべきことはこれだけです。このプロセスは、実際の情報のカプセル化です。
スロットはシグナルを受信するために使用されます。これらは、それに関連付けられたシグナルがあるかどうかを知りません。
Qt では、ボタンがクリックされたとき、ボタンがシグナルを送信し、このシグナルが別のオブジェクトに渡され、シグナルを受信したオブジェクトが対応するアクションを実行します。これがシグナルとスロットの仕組みです
2)。 、シグナルとスロットが渡されます
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::Connection type=Qt::AutoCompatConnection) は、送信者である
sender を関連付けます。信号
信号、送信される信号
受信者、信号の受信者
メソッド、スロット関数
タイプ、信号とスロットの関係
2)、タイプには 3 つのタイプがあります
Qt::DirectConnection、シグナルは送信直後にスロットに渡され、スロット関数のみが実行完了して返されると、シグナル送信後のコード「emit
」が実行可能になりますシグナル送信後はQt::QueueConnectionとなります。イベント ループがスロットに渡す能力を得るまでキューに入れられ、スロット関数が実行されるかどうかに関係なく、シグナルが送信されます。「emit
後のコード」はすぐに実行されますQt::AutoCompatConnection。信号とスロットが同じスレッド内にある場合は、Qt::DirectConnection と同等です。シグナルとスロットが同じスレッド内にない場合は、
Qt::QueueConnection と同等です。
2. シグナルとスロットの例
1. シグナル
オブジェクトの内部状態が変化すると、シグナルを発行できるのは、シグナルを定義するクラスとそのサブクラスだけです。たとえば、クリックされた信号は QPushButton クラスで事前定義されており、ボタンがクリックされると、クリックされた信号が出力されます。
Qt のシステム定義済みシグナルに加えて、シグナルをカスタマイズすることもできます
シグナルの宣言はヘッダー ファイルにあり、キーワード signals で始まります
signals:
void signal();
void signal(int x) ;
ここには 2 つの信号がありますが、それらは同じ名前ですが、異なるパラメーターを持ちます。これは関数のオーバーロードに似ています。
シグナルは通常の C++ 関数に似ていますが、エンティティはなく、空のシェルのみがあり、戻り値は常に void です。シグナルから有用な情報が返されることは期待できません。シグナルは宣言された後、moc ツールによって自動的に生成されるため、.cpp ファイルには配置しないでください。
システムの事前定義されたシグナルは通常、自動的に発行されるため、手動でシグナルを発行する必要がある場合は、次のように記述することができます。
2 スロットは通常の C++ メンバー関数であり、通常どおり呼び出すと、多くのシグナルをスロットに関連付けることができます。スロットは通常のメンバー関数であるため、権限もあります。したがって、スロット関数にはパブリック スロット、プライベート スロット、保護スロットの 3 種類があります。プライベート スロットの宣言もヘッダー ファイル内にあります。
void mySlot1();
void mySlot1(int x);
シグナル内で と スロット関数の宣言の前に、マクロ Q_OBJECT を追加する必要があります。この方法でのみ Qt はそれらを認識します
3. メタオブジェクト ツール
moc ツールは C++ でクラスの宣言を初期化します。 C++ コードでは、メタオブジェクトにはすべての信号とスロット、およびこれらの名前へのポインタが含まれます。
moc は C++ ソース ファイルを読み取り、Q_OBJECT マクロで宣言されたクラスを見つけると、別の C++ ソース ファイルを生成します。 moc ツールは #define を拡張しないため、シグナル関数とスロット関数にマクロ定義を含めることはできません
4. 関連付け
信号とスロット間の関連付けは関数 connect
btn = new QPushButton(); を介して行われます
lab = new QLabel ();
connect( btn, SIGNAL(clicked()), lab, SLOT(clear()))
シグナルはマクロ SIGNAL() を使用する必要があり、スロット関数はマクロ SLOT() を使用する必要があります。シグナルとスロットのパラメーターは一貫している必要があります。
シグナルとスロットが同じオブジェクトに属している場合、シグナルの受信者は省略できます
connect(btn, SIGNAL(clicked()), SLOT(showMenu( )))
シグナルとスロットの注意すべき問題点
1)、シグナルとスロット領域内にコンストラクターを置くことはできない
2)、シグナルとスロットのパラメータとして関数ポインタを使用することはできない
3)、シグナルスロットはデフォルトのパラメーターを持つことはできません
4)、シグナルとスロットはテンプレート クラス パラメーターを持つことはできません
5)、ネストされたクラスはシグナルとスロット領域に存在することはできません、また、シグナルとスロットを持つこともできません
http://www.bkjia.com/PHPjc/1068093.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1068093.html技術記事 lesson2-信号とスロットの仕組み 1. 信号とスロットの理解 1. 信号とスロットとは何ですか? 多くの GUI ツールでは、各ウィジェットには、トリガー機能に応答するコールバック関数があります...