Após 18 meses ... comecei com comentários sob a resposta de @Mat e estava ficando sem espaço rapidamente. Portanto, a resposta.
IMO emit
não é açúcar sintático nem uma palavra-chave simples no sentido de que
- Ele gera código (conforme explicado por @Mat acima),
- Ajuda o
connect
mecanismo a reconhecer que de fato é um signal
, e
- Isso torna seu sinal parte de um sistema "maior", onde sinais e respostas (slots) podem ser executados de forma síncrona ou assíncrona, ou enfileirados, dependendo de onde e como o sinal foi emitido. Este é um recurso extremamente útil do sistema de sinal / slot.
Todo o sistema de sinal / slot é um idioma diferente de uma simples chamada de função. Acredito que decorra do padrão do observador. Há também uma grande diferença entre a signal
e a slot
: um sinal não precisa ser implementado, mas um slot deve ser !
Você está andando na rua e vê uma casa pegando fogo (um sinal). Você disca 911 ( conecta o sinal de incêndio com o slot de resposta do 911 ). O sinal foi apenas emitido , enquanto o slot foi implementado pelo corpo de bombeiros. Pode ser impreciso, mas essa é a ideia. Vejamos o exemplo do OP.
Algum objeto de back-end sabe quanto progresso foi feito. Portanto, poderia simplesmente emit progressNotification(...)
sinalizar. Cabe à classe que exibe a barra de progresso real, captar esse sinal e executá-lo. Mas como a visualização se conecta a esse sinal? Bem-vindo ao sistema de sinal / slot do Qt. Agora, pode-se conceber uma classe de gerenciador (normalmente um tipo de widget), que consiste em um objeto de visualização e um objeto de computação de dados (ambos sendo QObjects
) connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Não vamos entrar nos aspectos de design da classe de gerenciador, mas basta dizer que é aqui que o sistema de sinal / slot se destaca. Posso me concentrar em projetar uma arquitetura muito limpa para meu aplicativo. Nem sempre, mas muitas vezes, acho que apenas emito sinais, mas implemento slots .
Se for possível usar / chamar um método de sinal sem nunca emiti-lo , isso necessariamente implica que você nunca precisou dessa função como um sinal em primeiro lugar.
emit
não é necessário. É estranho, porém, que você aprendeuemit
muito depois de chamar sinais diretamente, já que o sistema de slots de sinal é uma das primeiras coisas a serem aprendidas sobre o Qt.