Ich bin mit dem Konstruktor QWidget(QWidget *parent)
. Das Eltern-widget enthält eine Menge von Kind-widgets. Ich löschen müssen alle Kind-widgets von der übergeordneten zur Laufzeit. Wie kann ich dies tun?
InformationsquelleAutor der Frage saravanan | 2010-10-15
Können Sie die folgenden in Ihrem übergeordneten widget-Klasse:
InformationsquelleAutor der Antwort Yulia Rogovaya
Vorherige Antwort ist falsch!! Sie können nicht verwenden
findChildren
löschen Sie ein widget Kinder, weil Qt4 istfindChildren
rekursiv Listen Kinder. Deshalb, löschen Sie die Kinder der Kinder, die dann möglicherweise gelöscht werden, zweimal, potenziell Absturz der app.Generell in Qt, wobei eine Liste von
QObject
Zeiger und löschen Sie eins nach gefährlich, da die Zerstörung eines Objekts kann die Kette zerstören andere Objekte, durch die übergeordneten Besitz-Mechanismus oder durch den Anschluss einesdestroyed()
- signal zu einemdeleteLater()
slot. Daher die Zerstörung der ersten Objekte in der Liste können dadurch die nächsten.Müssen Sie Liste Kinder-widgets:
InformationsquelleAutor der Antwort galinette
Kümmern sich um die recursivity problem aufgezeigt von @galinette können Sie einfach entfernen Sie die widgets in einer while-Schleife
InformationsquelleAutor der Antwort Matthias Kuhn
Vom Qt docs
Folgende code-fragment zeigt einen sicheren Weg, um zu entfernen alle Elemente aus einem layout -:
InformationsquelleAutor der Antwort ManuelSchneid3r
Zusammenfassung und Ergänzung:
Für Qt5 in einer Zeile:
Für Qt5 für viele Kinder, mit setUpdatesEnabled():
Beachten Sie, dass dies ist nicht exception-sicher! Während Qt nicht in dieser Zeit erscheinen Ausnahmen hier, das signal zerstört() miteinander verbunden werden könnten, um code zu werfen, oder eine überschriebene Objekt::childEvent(QChildEvent*) werfen könnte.
Besser wäre die Verwendung einer Helfer-Klasse:
...
Für Qt4:
Entfernen von QLayout funktioniert in beide Qt4 und Qt5:
QObjects (und daher QWidgets) entfernen Sie sich (automatisch) von Ihren Eltern in Ihrer (QObject) Destruktor.
InformationsquelleAutor der Antwort Edward LeBlanc