Qt Creatorモジュールの学習信号とスロット

Qt Creatorモジュールの概要信号とスロット

シグナルとスロットとは

例を通して、プロセス全体を証明したいと思います。たとえば、ライトがオンになっているとき、スイッチのボタンは信号のアドレスに相当します。ボタンを押すと信号がトリガーされ、
ライトが結果になります。それは、ボタンのトリガーを通じて機能を実行することです。

信号とスロットの特性

1.信号とスロットはパラメータを持つことができますが、戻り値はありません。
2.信号とスロット関数のパラメーターの数が同じ場合、それらのパラメータータイプは完全に同じでなければなりません。
3.信号のパラメーターテーブルはスロットのパラメーターテーブルよりも大きいですが、信号のパラメーターテーブルの最初のパラメーターから始めて、完全にスロットのパラメーターテーブルに対応させることができます。信号の余分なパラメーターはスロットによって無視されます。
4.一般に、関数ポインターをパラメーターとして渡すことはできません。テンプレートクラスオブジェクトをパラメーターとして渡すことはできませんが
、qRegistMetaType関数を使用してテンプレートクラスをメタタイプとして登録すると、次のものを渡すことができます。

#include<QMetaType>

qRegistMetaType<QList<void*>>("QList<void*>)

接続機能

コネクト機能とはなんですか?Baiduで検索できますが、ここでは使い方だけを説明します。
接続(信号によって送信されるアドレスはライトスイッチの場所であり、信号が送信される方法はライトをオンにすることであり、レシーバーアドレスはライトの場所であり、信号処理関数はライトオンイベントです); `
例:

 p1.setText(" close");
 p1.move(100,100);
 connect(&p1,&QPushButton::pressed,this,&MainWindow::close);

例のp1は、クラスのプライベート変数で宣言されています。これは標準の信号とスロットです(QTでは押して閉じることができます)

カスタム信号とスロット

この点を説明する小さなプログラムを作成しました。最初に2つのウィンドウを作成しました。1つは子ウィンドウで、もう1つは親ウィンドウで、次に各ウィンドウにボタンがあります。プログラムの最初は、親ウィンドウのみが表示されています。ボタンをクリックすると、親ウィンドウが非表示になり、子ウィンドウが表示されます。子ウィンドウボタンをクリックすると、子ウィンドウが非表示になり、親ウィンドウが表示されます。消滅はカスタムスロット関数によって実現され、シグナルは子ウィンドウが親ウィンドウに送信されるときに実現されます。

 setWindowTitle("主窗口");
    b1.setParent(this);
    b1.setText("切换子窗口");
    b1.move(100,100);
    //点击按钮
    connect(&b1,&QPushButton::released,this,&Widget::a);
    //处理子窗口信号
    connect(&w, &laoer::mysignal,this,&Widget::deal);
//主窗口按钮点击后槽函数
void Widget::a(){
    
    
    w.show();
    this->hide();
}
//用来处理子窗口发送的信号
void Widget::deal(){
    
    
    w.hide();
    this->show();
}

ここでは、カスタムシグナルを宣言します。シグナルには、signalsキーワード宣言が必要です。

signals:
void mysignal();

ボタンをクリックした後の信号送信です。メインウィンドウに送信後、メインウィンドウが処理を開始します。コード1を見てください。この記事の目的は、コピー後に誰でも簡単に確認できるようにすることです。

void laoer::sendslot(){
    
    
    emit mysignal();
}

パラメータ付きの信号とスロット

自分ではあまり勉強していないので、恥ずかしくないように自分の理解についてしか話せません。
記事の冒頭で、おそらく信号とスロットの特性について書きました。したがって、ここではデモとして単純なコードのみを使用します。
私は個人的に、パラメーター付きのスロット関数は値を渡すことだと思います...
まず、サブウィンドウに信号を追加します(より便利な認識のために、関数のオーバーロードを使用しました)。

signals:
   
    void mysignal();
    void mysignal(int a,QString str);

次に、この信号を送信します。

void laoer::sendslot(){
    
    
  emit mysignal();
  emit mysignal(5,"s");
}
connect(&b2,&QPushButton::clicked,this,&laoer::sendslot);

受信した信号を理解するのは簡単ではありません。まずコードをアップロードしてから、詳細に説明します。

 void (laoer::*funsignal)()= &laoer::mysignal;
    connect(&w,funsignal,this,&Widget::dealle);
    void (laoer::*textsignal)(int,QString)= &laoer::mysignal;
    connect(&w,textsignal,this,&Widget::dealsignal);

ここでは2つの信号名が同じであるため、connect関数の場合、受け入れる信号がわかりません。関数のオーバーロードに基づいてポインターを追加します。つまり、ここでは関数ポインターを使用します。インターネットで検索できます何言ったのかわかりませんのでごめんなさい

ラムダ式

使用条件:config + = c ++ 11(proファイル内)
利点:信号と連携することは非常に便利です
形式:接続(信号送信アドレス、信号送信方法、
{ } ); []記号の中央には、次の{}内の変数を示し、いかなる変数が{}で定義されていても、[]内に存在しない場合、これは、1つずつ呼び出すことはできませんこれは、書き込みに面倒で、以下のようしたがって、いくつかのシンボルは、特定のセットを示します:「= ":すべての外部ローカル変数とクラスのすべてのメンバーを値によって転送する手段" this ":クラスのすべてのメンバーを値によって転送する手段"& ":すべての外部ローカル変数を値によって転送する手段





()記号はパラメータを示します。

使い方:

  b1.setParent(this);
    b1.setText("@_@");
    b1.move(100,100);
    connect(&b1,&QPushButton::released,
            [=](){
    
    
 b1.setText("^_^");
           }
);

おすすめ

転載: blog.csdn.net/m0_50210478/article/details/108126729