Prefácio
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.
Artigo Diretório
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
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.
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.
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!