Ist es möglich, trennen Sie alle von QObject verbindungen, ohne Sie zu löschen
Habe ich ein QObject ist, diese angeschlossen ist an ein anderes QObject B. Jetzt will ich Eine Verbindung zu C, eine Dritte QObject und vollständig zu trennen von der B.
Easy peasy! Problem ist ich habe eine Menge von A, die jeweils mit Ihren eigenen Satz von Signalen und slots (B/C sind generisch). Bisher habe ich manuell machen, ein verbinden und ein trennen-Methode für jede Klasse geben. Die Methoden sind im Grunde Kopien von einander, den Austausch der connect
für disconnect
nennen, gegen den don ' T repeat yourself).
Also meine Frage ist: Ist die folgende Funktion möglich?
void deleteAllConnections(QObject* someObject) {
//TODO disconnect all connections owned by someObject
//For bonus points: Is there a way of accessing the QMetaObject connected to?
}
Habe ich stocherte in der QMetaObjectQObject und die Signale und Slots Dokumentation mit kein Glück (obwohl, dass ist oft keine Garantie...).
InformationsquelleAutor der Frage Troyseph | 2015-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mindestens 2 Möglichkeiten. Trennen Sie zunächst alles.
Sekunde. Jeder
connect()
gibtQMetaObject::Connection
die können kopiert oder verschoben werden, so dass Sie sparen können einige verbindungen in der Liste und nach einiger Zeit, nur eine Iteration durch die Liste und rufen Siedisconnect()
für jedes Objekt. Beispiel mit einer Verbindung:Bonus: Nein, Qt nicht unterstützen, wie Tiefe Introspektion, können Sie keine Liste aller angeschlossenen slots oder etwas anderes, aber in den meisten Fällen, Sie brauchen nicht zu dieser überhaupt. Eine nützliche info, dass Qt gibt Sie ist
sender()
Zeiger auf Objekt, das gesendet signal.Bearbeiten
Als doc sagte:
So, in dem nächsten Beispiel werden beide Fenster angezeigt:
Aber kommentieren Sie
a->disconnect();
und nurA
windows angezeigt werden. Es bedeutet, dassQObject::connect(b,SIGNAL(objectNameChanged(QString)),a,SLOT(show()));
wurde nicht getrennt, wie es in dem doc. Wenn Sie möchten, dieses Rätsel zu lösen, die Sie tun könnena->disconnect(b);b->disconnect(a);
aber es ist natürlich sehr schlechter Ansatz. So können Sie den zweiten Vorschlag aus meiner Antwort:InformationsquelleAutor der Antwort Chernobyl