web-dev-qa-db-fra.com

signaux qt privés / publics

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)?

36
anton

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 .

25
Andrei Vlasyuk

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.

20
Frank Osterfeld

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

15
Nikita Krupenko

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(...);
}
15
gregseth

Les signaux Qt sont publics dans le sens où n'importe quel objet peut se connecter à n'importe quel signal.

5
Kyle Lutz

Vous pouvez utiliser le modèle PIMPL pour cela. Vos signaux privés existent uniquement dans l'implémentation privée.

0
Th. Thielemann