Qt signaux et des slots: autorisations

il y a des divergences entre les réponses respectées ici sur SO et les docs Qt réels.

j'ai lu cette question et j'en veux d'autres précisions. Est-ce que quelqu'un peut confirmer:

  • un signal est toujours protected , il ne peut donc être émis que par la classe ou l'une de ses sous-classes. Je ne suis pas sûr que ce soit vrai; la question ci-dessus montre des réponses appuyant cette déclaration. Mais le Qt docs dis: Signals are public access functions and can be emitted from anywhere, but we recommend to only emit them from the class that defines the signal and its subclasses. Alors, qui est-il?
  • les créneaux horaires ne sont que des fonctions, et peuvent donc être publics, privés ou protégés. Évidemment, une classe extérieure aura la capacité de contrôler si votre classe connecte un de ses propres signaux à l'un de ses propres emplacements si la fente est publique. Cependant, encore une fois l'information SO diffère des docs, qui disent: a signal emitted from an instance of an arbitrary class can cause a private slot to be invoked in an instance of an unrelated class. cela signifie que private n'est pas honoré par le mécanisme signal/slot?
  • les mots public, privé, protégé n'ont pas d'utilité à travailler avec le signal mot-clé
  • le signal émis est toujours disponible pour toutes les autres classes, c'est-à-dire que toute autre classe peut toujours se connecter à ce signal (indépendamment de son autorisation d'émettre le signal).
  • bien que tous les signaux soient visibles par toutes les classes, vous pouvez toujours avoir deux classes avec des signaux du même nom puisque la fonction connect prend le nom de classe comme préfixe de signal (i.e. SomeClass::itsSignal )
20
demandé sur Community 2013-10-02 06:33:49
la source

3 ответов

  • les signaux sont protégés dans Qt4 mais sont publics dans Qt5, donc les informations contradictoires.
  • fentes sont des fonctions et public / protégé / privé est honoré en les appelant comme tels, en se connectant à un signal, le système metaobject l'ignore cependant.
  • comme signals est défini comme public: , les préparant avec p.ex. des fils privés

à:

private:
public: //signals:
    void theSignal();

donc c'est sans effet.

  • toutes les classes peuvent être connectées à n'importe quel signal, correct. Les signaux font partie de L'API publique à cet égard.
  • ayant des signatures de signal identiques n'est pas un problème. Le contexte est défini par l'objet spécifié comme Expéditeur.

à l'Aide de style ancien se connecter:

Apple *apple ... Orange* orange
connect(apple, SIGNAL(changed()), this, SLOT(appleChanged()));
connect(orange, SIGNAL(changed()), this, SLOT(orangeChanged()));

le signal est spécifié comme chaîne ici (sans le nom de classe dans it), mais comme apple et orange n'ont qu'un signal changed() chacun et que la recherche est faite dans le metaobject de L'instance de QObject, qui existe un par Classe (pas d'instance), ils ne peuvent pas entrer en collision.

version Qt 5 avec contrôle de compilation:

connect(apple, &Apple::changed, this, &MyReceiver::appleChanged);

ici on doit spécifier une fonction, donc selon la portée, on doit spécifier un nom de classe (et peut-être des espaces de noms). Comme un nom de fonction ambigu ne serait pas valide C++ et donc pas de compilation, donc, on est en sécurité ici.

30
répondu Frank Osterfeld 2013-10-02 11:46:38
la source

regardez qobjectdefs.h (QT5.0+). Il y a défini les macros moc

#     define signals public

Comme vous pouvez le voir les macros utilisées dans les fichiers d'en-tête pour les signaux sont définis comme publics. En ce qui concerne les directives explicites publiques,privées et protégées,celles-ci sont ignorées dans la section des signaux. Les versions antérieures de QT 5.0 ont des signaux définis comme étant protégés. Ceux-ci étaient encore disponibles pour les connexions utilisant la macro SIGNAL() .

Les fentes de la macro

#     define slots

est défini comme une macro vide et peut donc être utilisé avec:

public slots:
private slots:
protected slots:

la visibilité de la méthode est utilisée pour les appels de méthode directs, de sorte que private/protected ne peut pas être appelé directement à partir de classes étrangères.

, qui utilise l'instruction connect , fonctionne encore indépendamment de la visibilité. Il s'agit du comportement prévu et il est mis en œuvre dans le code généré par le gpm.

si je me souviens correctement dans les versions précédentes de Qt une fente était aussi public automatiquement, mais je n'ai pas trouvé de référence pour cela maintenant.

toute autre classe peut se connecter à un signal d'une classe étrangère, à condition que la macro Q_OBJECT soit donnée dans la classe et que la classe étrangère soit connue (en-tête inclus). Puisque les signaux sont définis par classe, il est parfaitement légal d'avoir le même signal dans différentes classes. C'est aussi assez pratique, par exemple avoir un signal sendInfo(QString) dans toutes les classes rendent la mémoire plus facile. La macro Q_OBJECT permet au moc de créer le code nécessaire pour connecter les signaux aux slots indépendamment de la visibilité.

4
répondu Sebastian Lange 2014-06-22 15:49:35
la source

Le signal émis est toujours disponible pour toutes les autres classes, qui est, de toute autre classe peut toujours se connecter à ce signal (indépendamment de son autorisation d'émettre le signal).

Dans Qt5, ce n'est pas nécessairement vrai. Un signal peut être défini avec QPrivateSignal comme argument final, et dans ce cas, seul l'objet qui a déclaré le signal serait capable de se connecter à lui.

0
répondu Nicolas Holthaus 2015-12-10 19:54:46
la source

Autres questions sur