Diferença entre emitir e emitem()
-
21-12-2019 - |
Pergunta
No Qt, ambos são válidos, e se comportam da mesma:
emit someSignal(value);
vs
emit(someSignal(value));
Existe alguma diferença?
Solução
Existe alguma diferença?
Não há nenhuma diferença de outros que o suporte externo, sendo desnecessário, para que os programadores preferem que, e é também o mais usado no Qt projetos lá fora.
A razão para a diferença é devido a este:
# define emit
Você pode ver a definição deste no código-fonte.
Portanto, é basicamente apenas declarou a um "vazio" cadeia de caracteres e o pré-processador irá substituir suas variantes:
someSignal(value);
ou
(someSignal(value));
Você poderia ver isso por si mesmo se, para um teste rápido, você interromper a execução do compilador após o pré-processamento é executado, por exemplo,o -E
opção no caso do gcc.
Mais informações:alguém no comentário tinham dúvidas sobre a emitir palavra-chave, pois ele polui o global macro espaço de nomes.Isso é verdade, mas é uma boa maneira de garantir que não é de alguma maneira comum de fazer isso, que é uma coisa boa.
Por outro lado, isto não é obrigatório, de forma que qualquer pessoa pudesse redefinir, anule, ou até mesmo desligá-lo dizendo o Qt não usar as palavras-chave da seguinte forma:
CONFIG += no_keywords
Dessa forma, ele poderia ainda ser possível utilizar o Qt sinal-slot com mecanismo de Q_SIGNAL
, Q_SIGNALS
, Q_SLOT
, Q_SLOTS
, Q_EMIT
e tudo o que.
Aqui você pode encontrar o documentação correspondente sobre Q_EMIT
, por exemplo:
Q_EMIT
Utilizar esta macro para substituir a emitir palavra-chave para que emitem sinais, quando você deseja usar o Qt Sinais e Slots com uma festa de 3 signal/slot mecanismo.
A macro é normalmente usado quando no_keywords é especificado com a CONFIGURAÇÃO de variáveis .pro arquivo, mas ele pode ser usado mesmo quando no_keywords não é especificado.
Outras dicas
Não há nenhuma diferença.Na verdade, emit
é definida como uma macro vazia, tão só
someSignal(value);
é também equivalente.O emit
só torna a coisa mais óbvia que você está provocando um Qt sinal.
Não há absolutamente nenhuma diferença.É um vazio definição de pré-processador e, portanto, é removido antes que o compilador consegue ver o código.Tanto quanto o compilador está em causa, isso não existe mesmo.
Ele existe apenas para o benefício do programador, para que ele/ela sabe que, naquele ponto, um sinal pode, eventualmente, ser processado e pode ajudar na depuração de código.