Um mecanismo de sinal e slot
1 Conceito
Sinal e slot é um mecanismo de comunicação definido no Qt para realizar a interação entre objetos. Quando um objeto muda, um sinal será enviado. Este sinal pode ser recebido por outros objetos. Uma função de membro especificada (função de slot) será executada.
Ilustração:
2 Definição
1) A classe que contém o sinal ou slot deve ser uma subclasse de QObject
2) O sinal é marcado com "sinais:", a função de sinal só precisa ser declarada e a definição não pode ser gravada
3) O slot é marcado com "slots públicos:", a função de slot pode ser Um determinado sinal estabelece uma conexão e aciona a execução da função de slot por meio de um determinado sinal; além disso, a função de slot também pode ser usada como uma função de membro comum, chamada diretamente
4) a classe que contém o sinal ou slot, a macro "Q_OBJECT" precisa ser adicionada à frente e o projeto será construído no futuro , Ele chamará moc (compilador de meta-objetos) para restaurar o sinal ou slot da extensão de sintaxe no código C ++ padrão.
Formato de implementação de código:
classe XX: public QObject {
Q_OBJECT //
sinais moc :
voF sigFunc (void); // Função de sinal
slots públicos:
void slotFunc (void) {...} // slot function
};
3 Conexão de sinal e slot
QObject :: connect (
const QObject * remetente, // Objeto de envio de sinal, pode ser todos os tipos de subclasse de QObject
const char * sinal, // Função de sinal
const QObject * receiver, // Objeto de recebimento de sinal, pode ser QObject todos os tipos de subclasses
const char * method); // Slot function
Nota :
SIGNAL (função de sinal (tabela de parâmetros)) // Converter a função de sinal em const char *
SLOT (função de slot (tabela de parâmetros)) // Converter a função de slot em const char *
Caso: Crie um aplicativo Qt, que contém Um rótulo e um botão para fechá-lo clicando no botão
4 Os requisitos de sintaxe de conexão de sinal e slot
1) Os parâmetros de sinal e slot devem ser consistentes
QObject :: connect (A, SIGNAL (sigFunc (int)), B, SLOT (slotFunc (int))); // ok
QObject :: connect ( A, SIGNAL (sigFunc (vazio)), B, SLOT (slotFunc (int))); // erro
A implementação da função de slot na versão antiga do Qt:
conectar (A, SINAL (sigFunc (int)), B, SLOT (slotFunc (int)));
A implementação da função de slot na nova versão do Qt:
conectar (A, Sinal1, B, Slot1);
As características da versão antiga da função de função de slot: as vantagens dos parâmetros são intuitivas e as desvantagens não são a detecção de tipo, portanto, não é recomendável usar
2) Pode transportar parâmetros padrão da
classe B {
Q_OBJECT
slots públicos:
slotFunc vazio (int i = 0) {}
};
QObject :: connect (A, SIGNAL (sigFunc (vazio)), B, SLOT (slotFunc (vazio)) )); // ok
3) Os parâmetros da função de sinal podem ser superiores aos parâmetros da função de slot, os parâmetros em excesso serão ignorados e o contrário não será possível
QObject :: connect (A, SIGNAL (sigFunc (int)), B, SLOT (slotFunc (void ))); // ok
4) Um sinal pode ser conectado a várias funções de slot (um para muitos)
QObject :: connect (A, SIGNAL (sigFunc (int)), B1, SLOT (slotFunc1 (int))) / / ok
QObject :: connect (A, SIGNAL (sigFunc (int)), B2, SLOT (slotFunc2 (int))); // OK
Nota: Se o objeto A enviar preferências, as funções de slot de B1 e B2 serão executadas
5) Vários sinais podem ser conectados à mesma função de slot ao mesmo tempo (muitos para um)
QObject :: connect (A1, SIGNAL (sigFunc1 (int)), B, SLOT (slotFunc (int))); // ok
QObject :: connect (A2, SIGNAL (sigFunc2 (int)), B, SLOT (slotFunc (int))); // ok
Nota: Não importa se A1 ou A2 envia um sinal, a função de slot de B será executada
6) Dois sinais A função pode ser conectada diretamente (sinal em série) // Entenda
QObject :: connect (A1, SIGNAL (sigFunc1 (int)), A2, SIGNAL (sigFunc2 (int))); // OK
Nota: Quando A1 envia um sinal, ele é conectado O sinal do objeto A2 também será enviado.
Expressões lambda também são usadas várias vezes ao aplicar funções de slot;
Expressão lambda: usada para definir e criar objetos de função anônimos.
A sintaxe do Lambda é a seguinte:
[Parâmetro do objeto de função] ( Parâmetro da função de sobrecarga do operador) declaração mutável ou de exceção- > tipo de valor de retorno {corpo da função}
[] É uma expressão lambda, escolha a maneira de passar
[] () {Btn-> settext ("aaaa");};
1, transferência de valor
[=] () {Btn-> settext ("aaaa");};
2, transferência de endereço
[&] () {Btn-> settext ("aaaa");};
Para uso específico, consulte o Baidu.