Est-il possible de débrancher tous un QObject de connexions sans le supprimer
J'ai un QObject A, il est connecté à un autre QObject B. Maintenant, je veux Un pour se connecter à C, un tiers de QObject et de complètement déconnecter de B.
Facile comme bonjour! La difficulté est que j'ai beaucoup de A chacun avec leur propre ensemble de signaux et de slots (B/C sont plus générique). Jusqu'à présent j'ai été manuellement en faisant une connexion et une déconnexion de la méthode pour chaque type de classe. Les méthodes sont essentiellement des copies les uns des autres, l'échange du connect
pour disconnect
appel, allant à l'encontre de la ne vous répétez pas).
Donc ma question est: Est-ce la fonction suivante possible?
void deleteAllConnections(QObject* someObject) {
//TODO disconnect all connections owned by someObject
//For bonus points: Is there a way of accessing the QMetaObject connected to?
}
J'ai tourné autour de la QMetaObject, QObject et la Les signaux et les Slots documentation à pas de chance (mais qui souvent n'est pas une garantie...).
QObject::disconnect();
doc.qt.io/qt-5/qobject.html#débranchez-5que les états de documentation
Disconnects all signals in this object from receiver's method.
je suis en train de lire qu'il se déconnecte tout de ce de l'objet signaux de autre de l'objet de slots, mais je ne sais pas encore si il déconnecte également autre de l'objet signaux de ce de l'objet de machines à sous.OriginalL'auteur Troyseph | 2015-08-20
Vous devez vous connecter pour publier un commentaire.
Il y a au moins 2 façons. Tout d'abord, débranchez tout.
Seconde. Chaque
connect()
retourneQMetaObject::Connexion
qui peut être copié ou déplacé, de sorte que vous pouvez enregistrer des contacts dans la liste et après un certain temps, il suffit de parcourir la liste et appelerdisconnect()
pour chaque objet. Exemple avec une connexion:Bonus: non, Qt ne pas soutenir une telle introspection profonde, vous ne pouvez pas obtenir la liste de tous les connectés des fentes ou quelque chose d'autre, mais dans la plupart des cas, vous n'avez pas besoin de cela. Une info utile, que Qt vous donne est
sender()
, pointeur vers l'objet qui a envoyé le signal.Modifier
Comme doc dit:
Ainsi, dans l'exemple suivant, les deux fenêtres sont affichées:
Mais décommentez
a->disconnect();
et seulementA
windows sera affiché. Cela signifie queQObject::connect(b,SIGNAL(objectNameChanged(QString)),a,SLOT(show()));
n'a pas été déconnecté comme indiqué dans la doc. Si vous voulez résoudre ce puzzle, vous pouvez le fairea->disconnect(b);b->disconnect(a);
, mais il est bien sûr très mauvaise approche. Ainsi, vous pouvez utiliser la deuxième suggestion de ma réponse:disconnect everything
débranchez les connexions entrantes et sortantes?Voir mon édité réponse s'il vous plaît.
OriginalL'auteur Chernobyl