Différence entre émettre et emit()
-
21-12-2019 - |
Question
Dans Qt, les deux sont valables, et se comportent de la même:
emit someSignal(value);
vs
emit(someSignal(value));
Quelle est la différence?
La solution
Quelle est la différence?
Il n'y a pas de différence autre que le support externe étant inutile, donc, les programmeurs préfèrent que, et il est aussi plus classiquement utilisés dans Qt projets en cours.
La raison de l'absence de différence est due à ceci:
# define emit
Vous pouvez voir la définition de ce dans le code source.
Par conséquent, il est fondamentalement juste déclaré à un "vide", de chaîne et de préprocesseur remplace variantes:
someSignal(value);
ou
(someSignal(value));
Vous le voyez vous-même si, pour un test rapide, vous arrêtez l'exécution du compilateur après le préprocesseur est exécuté, par exemplel' -E
option en cas de gcc.
Plus d'informations:quelqu'un dans le commentaire qui avait des doutes sur le mot clé emit parce qu'il pollue la macro global de l'espace de noms.C'est vrai, mais c'est une bonne manière de garantir qu'il ya une certaine manière commune de faire ce qui est une bonne chose.
D'autre part, ce n'est pas obligatoire, donc n'importe qui pourrait redéfinir, la destruction, ou même de l'éteindre en disant Qt ne pas utiliser des mots-clés comme suit:
CONFIG += no_keywords
De cette façon, il pourrait être encore possible d'utiliser l'intervalle Qt signal-slot mécanisme de Q_SIGNAL
, Q_SIGNALS
, Q_SLOT
, Q_SLOTS
, Q_EMIT
et tout cela.
Ici vous pouvez trouver les la documentation correspondante sur Q_EMIT
, par exemple:
Q_EMIT
Utiliser cette macro pour remplacer le mot clé emit pour émettre des signaux, lorsque vous souhaitez utiliser Qt Signaux et les Slots avec une 3ème partie de signal/slot mécanisme.
La macro est normalement utilisé lors de la no_keywords est spécifié avec la variable de CONFIG dans le .fichier pro, mais il peut être utilisé même lorsque no_keywords n'est pas spécifié.
Autres conseils
Il n'y a pas de différence.En fait, emit
est défini comme un vide macro, il suffit donc de
someSignal(value);
est également équivalent.L' emit
il fait juste plus évident que vous êtes le déclenchement d'un signal Qt.
Il n'y a absolument aucune différence.C'est une définition de préprocesseur vide et est donc supprimée avant que le compilateur ne puisse voir le code.En ce qui concerne le compilateur concerné, cela n'existe même pas.
Il existe uniquement uniquement au profit du programmeur, de le faire savoir qu'à ce stade, un signal pourrait éventuellement être traité et pourrait aider au débogage du code.