Les signaux Qt peuvent-ils être publics ou privés? Puis-je créer des signaux internes, qui ne sont visibles qu'à l'intérieur de la classe?
pdate: J'ai une classe avec quelques signaux internes. Comment puis-je rendre ces signaux invisibles pour d'autres classes (encapsulation et masquage d'informations)?
Non. Les signaux ne peuvent pas être publics ou privés. Les signaux Qt sont des méthodes de classe protégées.
Le mot-clé "signaux" est défini dans qobjectdefs.h (ligne 69 comme pour Qt 4.6.1):
# define signals protected
MISE À JOUR: les signaux ne sont que protected
jusqu'à et y compris toutes les versions mineures de Qt 4. À partir de Qt 5.0, ils sont public
. Voir https://stackoverflow.com/a/19130831 .
Une manière courante, par ex. vu dans kdelibs, est-ce:
Q_SIGNALS:
#ifndef Q_MOC_RUN
private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private
#endif
void somePrivateSignal();
Cela rend le signal privé, c'est-à-dire qu'il ne peut être émis que par la classe elle-même mais pas par ses sous-classes. Pour ne pas faire en sorte que le "private:" écrase Q_SIGNALS (moc ne verrait alors pas un certainPrivateSignal comme signal), c'est à l'intérieur de Q_MOC_RUN, qui n'est défini que lorsque moc s'exécute.
Edit: Cette approche ne fonctionne pas pour les connexions de nouveau style introduites avec Qt 5 (connect(a, &A::someSignal, b, &B::someSlot)
), car elles nécessitent que le signal soit accessible.
Les signaux étaient protected
en Qt4, en Qt5 ils sont public
. Int Qt5 vous pouvez les faire private
en ajoutant QPrivateSignal
comme dernier argument. Plus d'informations à ce sujet: http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
Les machines à sous sont des méthodes simples qui peuvent être publiques, protégées ou privées.
Comme l'a souligné Andrei, le signal n'est qu'une redéfinition de protégé, ce qui signifie qu'il ne peut être émis que par la classe dans laquelle il est défini.
Si vous voulez qu'une classe émette un signal depuis une autre, vous devez lui ajouter une méthode publique (ou slot) comme celle-ci:
void emitTheSignal(...) {
emit theSignal(...);
}
Les signaux Qt sont publics dans le sens où n'importe quel objet peut se connecter à n'importe quel signal.
Vous pouvez utiliser le modèle PIMPL pour cela. Vos signaux privés existent uniquement dans l'implémentation privée.