Qtのカスタム信号とスロットを理解していませんか?この記事を見に来てください!

序文

ここに写真の説明を挿入

前学期は、最終的な宿題が必要だったので、図のようにQtを使って学生管理システムを作ることにしました。このプロジェクトを行う過程で、私はQtの信号とスロットについてより深く理解しています(このプロジェクトについてのアイデアがあれば、私に連絡してください)。
この記事には、Qtの基礎となるより深い実装は含まれていません。私の個人的な理解について、話してください。

ヒント:以下はこの記事の内容です。以下のケースは参照用です

1.信号とスロットとは何ですか

1.電話をかける

実生活では、誰もがほぼ常に情報を受け取り、イベントを処理していることを私たちは知っています。
電話をかける例を見てみましょう。電話
がある場合、「電話」はイベントです。
つまり、イベント電話」が発生し、
電話が鳴っている」と聞こえます。この「電話が鳴っている」は信号に相当する
ので「答える」ということは、
電話音」の信号を受信して処理して応答するという意味で、応答の仕方は「答え」です。

2.呼び出しの一連のアクションをQtプログラムに入れると、どのようになりますか?

この一連のアクションをQtプログラムに入れるとはどういうことかを思い出してみましょう。Qtのイベント監視は、人間の脳が人生で情報を受け取ることに相当します。
電話を鳴らすこと自体がインシデントですが、インシデントが発生したことをどのようにして知ることができますか?もちろん、それは電話から鳴っている電話でした。
そして、この携帯電話のリングがあるのQtによって送られた信号は、我々はconnect関数を通じてこの信号を取得したり、直接イベントリスナーを使用して(この記事は唯一コネクト機能について説明します)、次に通過できるスロット機能は、我々はこれらの信号を処理することができます、いくつかの記事を行います。

通常信号の送信

ここに写真の説明を挿入

2、信号、スロット

共通の信号とスロット

QPushButton* btn = new QPushButton("按钮1", this);
connect(btn,&QPushButton::clicked,[](){
    
    
	//CODEBLOCKS
});

もちろん、Qtアシスタントを確認すると、QPushButtonがQAbstractButtonクラスを継承し、QAbstractButtonクラスにクリックされた信号があるvoid clicked(bool checked = false)ことがわかります。パラメーターを持っていることがわかります。それでは、上記のコードの匿名スロット関数がパラメーターを持っていないのはなぜですか。信号とスロットパラメータの間に1対1の対応はありませんか?
もちろん、1対1の対応がありますが、この信号にはデフォルト値が含まれているため、この場合、スロット関数のパラメーターを省略できます。

カスタム信号とスロット

準備オーケー

まず、メインウィンドウウィンドウを定義しましょう(Visual Studio 2019でコードを記述したため、一部のヘッダーファイルはQt自体とは多少異なりますが、学習には影響しません)
最初に実装コードを破棄してから、聞いてください。道が来る。

SignalAndSlot.h

#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_SignalAndSlot.h"
#include <qpushbutton.h>
#include <qtextedit.h>
class SignalAndSlot : public QMainWindow
{
    
    
    Q_OBJECT

public:
    SignalAndSlot(QWidget *parent = Q_NULLPTR);
    QPushButton* btn;//举例用的按钮组件
    QTextEdit* editText;//文本编辑框
    void init();//初始化组件函数
    void sendMySignal();//中间人
    void getEditTextContent(QString text);//接收文本消息的槽函数


private:
    Ui::SignalAndSlotClass ui;

signals:
    void mySignal(QString msg);//自定义信号
};

上記のヘッダーファイルでは、btnとeditTextがサンプルコンポーネントであり、init関数を使用して、コンポーネントメモリ、単純なレイアウト、および信号とスロット関数のバインドを割り当てます。

ヘッダーファイルメンバー変数の説明

メンバー変数 使用する
pubilc btn ボタンのサンプルコンポーネント
pubilc editText テキスト編集ボックスのサンプルコンポーネント
pubilc void init() コンポーネントメモリ、シンプルなレイアウト、および信号とスロット機能のバインドを割り当てます。
pubilc void sendMySignal() ボタンのクリック信号にバインドされるスロット機能は、クリック信号がトリガーされると、mySignal信号を送信します
pubilc void getEditTextContent(QString text) mySigal信号にバインドされるスロット関数。mySignal信号がトリガーされると、テキストキーボックス内のテキストメッセージが取得されます。
民間 ui インターフェイスの描画に使用されるQtのuiクラス、この記事には含まれていません
信号 void mySignal(QString msg) カスタム信号

SignalAndSlot.cpp

#include "SignalAndSlot.h"
#include <qmessagebox.h>
#pragma execution_character_set("utf-8")
SignalAndSlot::SignalAndSlot(QWidget *parent)
    : QMainWindow(parent)
{
    
    
    ui.setupUi(this);
    init();
}

/*初始化界面及事件绑定*/
void SignalAndSlot::init()
{
    
    
    btn = new QPushButton("按钮1", this);//一个按钮
    btn->move(200, 0);
    editText = new QTextEdit(this);//一个文本编辑框
    editText->resize(200, editText->size().height());

	
    connect(btn, &QPushButton::clicked, this, &SignalAndSlot::sendMySignal);//将按钮clicked信号与sendMySignal函数绑定
    connect(this, &SignalAndSlot::mySignal, this, &SignalAndSlot::getEditTextContent);//将mySignal这个自定义信号与getEditTextContent函数绑定
}

/*发送自定义信号-中间人*/
void SignalAndSlot::sendMySignal()
{
    
    
    QString text = this->editText->toPlainText();
    if (text.isEmpty() == false) {
    
    
        emit mySignal(text);//如果文本不为空,则将自定义信号发送出去,否则无事发生
    }
}

/*获取文本编辑框消息-自定义槽函数*/
void SignalAndSlot::getEditTextContent(QString text)
{
    
    
    if (text.isEmpty() == false) {
    
    //如果消息传递过来的值不为空,则提示消息内容
        QMessageBox::information(this, "内容:", text);
    }
    else {
    
    
        QMessageBox::warning(this, "Error:", "您还没输入内容呢!!!");
    }
}

処理する

カスタム信号を送信する

connect(btn, &QPushButton::clicked, this, &SignalAndSlot::sendMySignal);//将按钮clicked信号与sendMySignal函数绑定

ボタンをクリックすると、接続関数を使用するため、クリックした信号をsendMySignal()関数にバインドします。
したがって、ボタンがクリックされると、ボタンがクリックされた後にクリックされた信号がトリガーされます。接続が渡された後、sendMySignal()関数が実行され、
上記のコードからわかるように、sendMySignal()関数はテキスト編集ボックスのコンテンツを取得します。 、次に、テキストが空かどうかを判断します。空でない場合emit mySignal(text);は、編集ボックスの内容のテキストデータをシグナル追加して、シグナルを送信します。

カスタム信号を受信し、カスタムスロット機能をトリガーします

connect(this, &SignalAndSlot::mySignal, this, &SignalAndSlot::getEditTextContent);//将mySignal这个自定义信号与getEditTextContent函数绑定

上記のコードにより、mySignalはgetEditTextContent関数にバインドされます。そうすれば、すべてが自然に起こります。

ここに写真の説明を挿入
ここに写真の説明を挿入

クリックされた信号はsendMySignal関数にバインドされているため、mySignal信号はgetEditTextContent関数にバインドされています。
クリックされた信号がトリガーされると、sendMySignalスロット関数がテキストコンテンツを取得し、それをmySignal信号に追加して送信します。mySignalシグナルはgetEditTextContentスロット関数にバインドされているため、mySignalシグナルがトリガーされると、getEditTextContentはシグナルのテキストデータを取り出し、情報ボックスに表示します。
そのため、ボタンを押すと、情報ボックスにテキスト編集ボックスのテキストデータがポップアップ表示されます。
これはA-> B; B-> C;に似ているため
A-> Cを導入できるため、カスタム信号とスロットの機能が実現されます。
ここに写真の説明を挿入

カスタム信号とスロットの鍵

実際、十分に注意すれば、実際に電話に応答する場合でも、編集ボックスに関する情報を取得する場合でも、それらはすべて仲介者の役割を果たし、この仲介者はスロット関数sendMySignalであることに気付くはずです。
電話に出る場合、あなたの脳は仲介者として機能し、電話が鳴ります。これは、イベントが発生し、あなたの脳がそれを聞いたことを意味しますあなたがそれ答えることを選択し場合、あなたの脳電話の呼び出し音応答しますこの応答プロセスは、カスタムスロットの機能の実現に対応しています。
では、どのスロット機能が仲介者であるかをどのように判断するのでしょうか。

信号を転送するのは仲介者です。

結論

2020-996 = 1024
996に別れを告げ、1024から始めましょう!

おすすめ

転載: blog.csdn.net/WildSky_/article/details/109251107