Qt Connect信号スロット

4892 ワード

信号とスロット機構はQTのコア機構である.信号とスロットは高度なインタフェースであり、オブジェクト間の通信に適用され、QTのコア特性であり、QTが他のツールパッケージと区別される重要な場所でもある.信号とスロットはQTが独自に定義した通信メカニズムであり、標準的なC/C++言語とは独立しているため、信号とスロットを正しく処理するには、moc(Meta Object Compiler)と呼ばれるQTツールを借りなければならない.このツールはC++プリプロセッサであり、高レベルの事象処理に必要な追加コードを自動的に生成する. 
QTではconnect()関数は関連部品の動作と実行の関数である.
起動関数で設定しますが、信号スロット関数では設定しません.すなわち起動すると関連付けられ,信号スロットに入れば1回目の動作を行い,関連付けを行い,2回目に実行できる関数である.
またconnect()関数のSLOT()のスロット関数は、ヘッダファイル定義でpublic slotまたはprivate slot関数に配置する必要があります.そうでなければ実現できません.コンパイルエラーです.
信号とスロットは任意の数と任意のタイプのパラメータ(タイプが一致する)を運ぶことができ、彼らはタイプが完全に安全で、コールバック関数のようにcore dumpsを生成しません.
 
QObjectまたはそのサブクラス(例えばQwidget)から派生したすべてのクラスは、信号およびスロットを含むことができる.オブジェクトがその状態を変更すると、信号はオブジェクトによって送信され、他端が誰がこの信号を受信しているのか分からない.これが真の情報パッケージであり、オブジェクトが真のソフトウェアコンポーネントとして使用されることを保証します.スロットは信号を受信するために使用されますが、通常のオブジェクトメンバー関数です.1つのスロットには、自分と接続されている信号があるかどうか分かりません.また,オブジェクトは具体的な通信メカニズムを理解していない.
 
スロット(Slots):
スロットは通常のC++メンバー関数であり、正常に呼び出すことができ、それらの唯一の特殊性は多くの信号がそれに関連することができることである.関連する信号が送信されると、このスロットが呼び出されます.スロットにはパラメータがありますが、スロットのパラメータにはデフォルト値はありません.
スロットは通常のメンバー関数であるため、他の関数と同様にアクセス権もあります.スロットのアクセス権限は、誰がそれに関連付けることができるかを決定します.通常のC++メンバー関数と同様に、スロット関数もpublic slots、private slots、protected slotsの3つのタイプに分けられます.//C++の3つの権限の作用と同じです;
  • public slots:この領域で宣言されたスロットは、任意のオブジェクトが信号を接続できることを意味します.これはコンポーネントのプログラミングに非常に役立ち、互いに理解していないオブジェクトを作成し、それらの信号をスロットに接続して、情報が正しく伝達されるようにすることができます.
  • protected slots:この領域で宣言されたスロットは、現在のクラスとそのサブクラスが信号を接続できることを意味します.これは、クラス実装の一部であるスロットに適していますが、インタフェースは外部に面しています.
  • private slots:この領域で宣言されたスロットは、クラスだけが信号を接続できることを意味します.これは、非常に緊密なクラスに適しています.

  • スロットも虚関数として宣言できるので、これも非常に役に立ちます.//継承されて使用されます;
     
    信号(Signals):
    ある信号が顧客または所有者の内部状態に変化すると、信号はオブジェクトによって送信される(emit).この信号を送信できるのは、この信号を定義したクラスおよびその派生クラスのみである.信号が送信されると、通常の関数呼び出しのように、関連するスロットがすぐに実行されます.信号‐スロット機構は任意のGUIイベントサイクルとは完全に独立している.すべてのスロットが返されると、送信関数(emit)が返されます.複数のスロットがある信号に関連付けられている場合、この信号が送信されると、これらのスロットは次々と実行されるが、それらの実行順序はランダムで不確定であり、どちらが先に実行され、どの後に実行されるかを人為的に指定することはできない.
    信号の宣言はヘッダファイルで行われ、QTのsignalsキーワードは信号宣言領域に入ったことを指摘し、その後、自分の信号を宣言することができる.
     
    信号とスロットの接続()関数:
    QObjectオブジェクトのconnect関数を呼び出すことで、あるオブジェクトの信号を別のオブジェクトのスロット関数に関連付け、送信者が信号を送信すると、受信者のスロット関数が呼び出されます.
    一般的には、次の2つのフォーマットを使用します.
    1、 QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver,
    
    
    
    const char * method, Qt::ConnectionType type = Qt::AutoConnection) [static]
    
    
    QLabel *label = new QLabel;     QScrollBar *scrollBar = new QScrollBar;     QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label, SLOT(setNum(int))); // SIGNAL() SLOT() ;; 2、QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection) [static]     QLabel *label = new QLabel;     QLineEdit *lineEdit = new QLineEdit;     QObject::connect(lineEdit, &QLineEdit::textChanged,label, &QLabel::setText); //

      
    信号がスロットに関連付けられる必要がない場合、disconnect関数を使用して接続を切断できます.次のように定義します.
     bool QObject::disconnect ( const QObject * sender, const char * signal, 
    
             const Object * receiver, const char * member ) [static]

           
       1、Disconnect everything connected to an object's signals:
        disconnect(myObject, 0, 0, 0);myobject->disconnect()に等しい.
       2、Disconnect everything connected to a specific signal:    disconnect(myObject, SIGNAL(mySignal()), 0, 0);myobject->disconnect(SIGNAL(mySignal));
      3、Disconnect a specific receiver:    disconnect(myObject, 0, myReceiver, 0);myobject->disconnect(myReceiver)に等しい.
    0 may be used as a wildcard, meaning "any signal", "any receiving object", or "any slot in the receiving object", respectively.
    The sender may never be 0. (You cannot disconnect signals from more than one object in a single call.)
    If signal is 0, it disconnects receiver and method from any signal. If not, only the specified signal is disconnected.
    If receiver is 0, it disconnects anything connected to signal. If not, slots in objects other than receiver are not disconnected.
    If method is 0, it disconnects anything that is connected to receiver. If not, only slots named method will be disconnected, and all other slots are left alone. The method must be 0 if receiver is left out, so you cannot disconnect a specifically-named slot on all objects.