Não entendeu os sinais e slots personalizados do Qt? Venha ver este artigo!

Prefácio

Insira a descrição da imagem aqui

No semestre passado, devido à necessidade de fazer uma lição de casa final, decidi usar o Qt para escrever um sistema de gerenciamento de alunos, conforme mostrado na figura. No processo de fazer este projeto, eu tenho um entendimento mais profundo dos sinais e slots do Qt (se você tiver idéias sobre este projeto, por favor, entre em contato comigo).
Este artigo não envolve a implementação mais profunda do Qt, apenas fale sobre meu entendimento pessoal.

Dica: a seguir está o conteúdo deste artigo, os seguintes casos são para referência

1. O que são sinais e slots

1. Faça uma chamada

Sabemos que, na vida real, todos recebem informações e lidam com eventos quase o tempo todo.
Tomemos um exemplo de como fazer uma chamada.
Quando há uma chamada, " ligar " é um evento. Em
outras palavras, o evento " chamada " ocorre
e você ouve o " telefone tocando ", esse " telefone tocando " é É equivalente a um sinal,
então você " atende ", o
que significa que recebe o sinal de " som do telefone ", processa e responde, e a forma de resposta é " atender ".

2. Qual deve ser a aparência de colocar a série de ações de fazer uma chamada em um programa Qt?

Vamos relembrar como deveria ser colocar esta série de ações no programa Qt: O monitoramento de eventos do Qt é equivalente ao cérebro humano recebendo informações em vida.
Tocar o telefone é um incidente em si, então como sabemos que o incidente ocorreu? Claro que era o telefone tocando do telefone .
E este toque de telefone é o sinal enviado pelo Qt , podemos obter esse sinal através da função de conexão ou diretamente usando o ouvinte de evento (este artigo discute apenas a função de conexão), e então através da função de slot , podemos processar esses sinais , Faça alguns artigos.

Transmissão de sinais comuns

Insira a descrição da imagem aqui

Dois, sinal, slot

Sinais e slots comuns

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

Claro, se você verificar o assistente Qt, descobrirá que QPushButton herda da classe QAbstractButton, e há um sinal clicado na classe QAbstractButton: void clicked(bool checked = false)você descobrirá que ele carrega um parâmetro, então por que a função de slot anônima no código acima não carrega um parâmetro? Não existe uma correspondência um a um entre os sinais e os parâmetros do slot?
Claro, há uma correspondência um a um, mas como esse sinal carrega um valor padrão, os parâmetros da função de slot podem ser omitidos neste caso.

Sinais e slots personalizados

Pronto para trabalhar

Primeiro, vamos definir uma janela MainWindow (porque escrevi o código no Visual Studio 2019, alguns dos arquivos de cabeçalho são um pouco diferentes do próprio Qt, mas isso não afeta o aprendizado).
Permita-me jogar fora o código de implementação primeiro e depois me escute. A estrada vem.

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);//自定义信号
};

No arquivo de cabeçalho acima, btn e editText são nossos componentes de amostra, e a função init é usada para alocar a memória do componente, layout simples e vinculação de sinais e funções de slot.

Descrição da variável de membro do arquivo de cabeçalho

Variáveis ​​de membro usar
pubilc btn Componente de exemplo de botão
pubilc editar texto Componente de exemplo de caixa de edição de texto
pubilc void init () Aloque a memória do componente, layout simples e vinculação de sinais e funções de slot.
pubilc void sendMySignal () A função de slot que será vinculada ao sinal clicado do botão, quando o sinal clicado for acionado, envia o sinal mySignal
pubilc void getEditTextContent (texto QString) A função de slot que será associada ao sinal mySigal, quando o sinal mySignal é acionado, a mensagem de texto na caixa de chave de texto é obtida
privado ui A classe ui do Qt, usada para desenhar a interface, este artigo não envolve
sinais void mySignal (QString msg) Sinal personalizado

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:", "您还没输入内容呢!!!");
    }
}

Processo

Envie um sinal personalizado

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

Quando clicamos no botão, associamos o sinal clicado à função sendMySignal () devido ao uso da função de conexão.
Portanto, quando o botão é clicado, o sinal clicado será acionado após o botão ser clicado. Depois que a conexão for passada, a função sendMySignal () será executada
e , como você pode ver no código acima, a função sendMySignal () obterá o conteúdo da caixa de edição de texto , E então julgar se o texto está vazio. Se não estiver vazio, emit mySignal(text);adicione os dados de texto do conteúdo da caixa de edição ao sinal e envie o sinal.

Receba sinal personalizado, acione a função de slot personalizado

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

Por meio do código acima, mySignal está vinculado à função getEditTextContent. Então tudo pode acontecer naturalmente.

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Como o sinal clicado está vinculado à função sendMySignal, o sinal mySignal é vinculado à função getEditTextContent.
Quando o sinal clicado é disparado, a função de slot sendMySignal obterá o conteúdo de texto e, em seguida, anexará ao sinal mySignal e o enviará. O sinal mySignal é vinculado à função de slot getEditTextContent, portanto, quando o sinal mySignal é disparado, getEditTextContent retirará os dados de texto do sinal e os exibirá em uma caixa de informações.
Portanto, quando o botão é pressionado, a caixa de informações exibe os dados de texto da caixa de edição de texto.
Isso é semelhante a A-> B; B-> C; Portanto, A-> C pode ser introduzido, de modo que
a função de sinais e slots personalizados é realizada.
Insira a descrição da imagem aqui

A chave para sinais e slots personalizados

Na verdade, se você for cuidadoso o suficiente, poderá notar que, seja um caso real de chamada telefônica ou a obtenção de informações sobre a caixa de edição, todos eles têm o papel de intermediário , e esse intermediário é a função de slot sendMySignal .
No caso de atender o telefone, seu cérebro atua como um intermediário.O telefone toca, o que significa que o evento aconteceu e seu cérebro o ouviu. Se você decidir atender , seu cérebro responde com o toque do telefone . Este processo de resposta corresponde à realização da função do slot personalizado.
Então, como determinar qual função de slot é o intermediário?

Quem encaminha o sinal é o intermediário.

Conclusão

2020-996 = 1024
Diga adeus ao 996 e comece a partir de 1024!

Acho que você gosta

Origin blog.csdn.net/WildSky_/article/details/109251107
Recomendado
Clasificación