Qt의 사용자 지정 신호 및 슬롯을 이해하지 못했습니까? 이 기사를 보러 오십시오!

머리말

여기에 사진 설명 삽입

지난 학기에는 마지막 숙제를해야했기 때문에 그림과 같이 Qt를 사용하여 학생 관리 시스템을 작성하기로 결정했습니다. 이 프로젝트를 수행하는 과정에서 Qt의 신호와 슬롯에 대해 더 깊이 이해하고 있습니다 (이 프로젝트에 대한 아이디어가 있으시면 저에게 연락하십시오).
이 기사는 더 깊은 Qt 구현을 포함하지 않고 내 개인적인 이해에 대해서만 이야기합니다.

팁 : 다음은이 기사의 내용이며 다음 사례는 참고 용입니다.

1. 신호 및 슬롯이란?

1. 전화 걸기

우리는 실생활에서 모든 사람이 거의 항상 정보를 받고 이벤트를 처리한다는 것을 알고 있습니다.
전화 걸기의 예를 들어 보겠습니다. 전화
가 오면 " call "은 이벤트입니다.
즉, " call " 이벤트 가 발생
하고 " phone ringing "이 들리면 이 " phone ringing "은 이는 신호와 동일
하므로 " 응답 "하면
" 전화 음 "신호 를 받고 처리하고 응답하며 응답 방법은 " 응답 "입니다.

2. Qt 프로그램에 일련의 호출 작업을 넣으려면 어떻게해야합니까?

이 일련의 행동을 Qt 프로그램에 넣는 것이 어떤 것인지 생각해 보겠습니다. Qt의 이벤트 모니터링은 인간의 뇌가 삶에서 정보를받는 것과 같습니다.
전화벨을 울리는 것은 그 자체로 사건이므로 사건이 발생했는지 어떻게 알 수 있습니까? 물론 전화에서 울리는 전화 였다.
그리고이 전화 링Qt 에서 보낸 신호입니다 . 우리는 연결 함수를 통해 또는 이벤트 리스너를 직접 사용하여이 신호를 얻을 수 있습니다 (이 기사에서는 연결 함수에 대해서만 설명합니다). 그런 다음 슬롯 함수 를 통해 이러한 신호를 처리 할 수 ​​있습니다. , 몇 가지 기사를 수행하십시오.

일반 신호 전송

여기에 사진 설명 삽입

두, 신호, 슬롯

일반 신호 및 슬롯

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

물론, Qt Assistant를 확인하면 QPushButton이 QAbstractButton 클래스에서 상속되고 QAbstractButton 클래스에 클릭 된 신호 void clicked(bool checked = false)가 있음을 알 수 있습니다. 매개 변수를 전달한다는 것을 알 수 있습니다. 위 코드의 익명 슬롯 함수가 매개 변수를 전달하지 않는 이유는 무엇입니까? 신호와 슬롯 매개 변수 사이에 일대일 대응이 있지 않습니까?
물론 일대일 대응이 있지만이 신호는 기본값을 가지고 있기 때문에이 경우 슬롯 기능의 매개 변수를 생략 할 수 있습니다.

맞춤형 신호 및 슬롯

작업 준비

먼저 MainWindow 창을 정의하겠습니다. (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 무효 init () 구성 요소 메모리, 간단한 레이아웃, 신호 및 슬롯 기능 바인딩을 할당합니다.
Pubilc void sendMySignal () 버튼의 클릭 된 신호에 바인딩 될 슬롯 함수는 클릭 된 신호가 트리거되면 mySignal 신호를 보냅니다.
Pubilc void getEditTextContent (QString 텍스트) 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函数绑定

버튼을 클릭하면 connect 함수 사용으로 인해 클릭 된 신호를 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