Entfernt sich ein QWidget bei der Zerstörung aus der GUI?

8

Wenn ich eine QWidget mit delete lösche, wird die Registrierung über die GUI aufgehoben oder muss ich das manuell tun? Gibt es einen logischen Grund für dieses Verhalten?

    
Pieter 17.05.2011, 17:54
quelle

2 Antworten

12

Wenn Sie addWidget in einem Layout oder einem gestapelten Widget aufrufen, wird die Eigentümerschaft des Widgets in das Layout / Stacked-Widget übertragen. All dies bedeutet, dass wenn das Layout / gestapelte Widget gelöscht wird, alle Widgets, die hinzugefügt wurden, ebenfalls gelöscht werden.

Es ist vollkommen in Ordnung, ein Widget zu löschen, sobald Sie damit fertig sind , unabhängig davon, wem es gehört . Das Eigentum ist einfach eine bequeme Art, den Speicher einer Objekthierarchie aufzuräumen. Es sagt in keiner Weise, dass das Objekt, das es besitzt, es löschen muss. Wenn das der Fall wäre, dann, wenn Sie alle Ihre Widgets hinzugefügt hätten, wären Sie nur in der Lage, sie alle oder gar nicht mehr loszuwerden!

Wenn Sie nicht möchten, dass Ihr Widget gelöscht wird, wenn das Layout / gestapelte Widget gelöscht wird, rufen Sie removeWidget auf. Beachten Sie, dass nicht klar ist, wo die Eigentümerschaft des Widgets wirklich liegt. Eine einfache Test-App. Ich habe gerade geschrieben, dass removeWidget gar nicht von einem QStackedWidget Besitz weggenommen hat!

Um Ihre Frage zu beantworten, wird Qt das Widget korrekt aus dem Layout- / gestapelten Widget entfernen, wenn Sie es löschen. Außerdem ist dies der richtige Weg, das Widget zu entfernen, wenn es nicht mehr im Layout / Stacked-Widget liegt.

    
Troubadour 17.05.2011, 18:55
quelle
7

Wie bereits von @CatPlusPlus gezeigt, verwendet Qt ein Ownership-System. Wenn Sie also Widgets zu Layouts oder Layouts zu Widgets usw. hinzufügen, wird die Eigentümerschaft des Addierers dem Addierer / Elternteil zugewiesen. Dies ist normalerweise in der Methodendokumentation dokumentiert. Wenn Sie sich beispielsweise die Dokumentation für QWidget :: addLayout (QLayout *) ansehen, heißt es, dass Qwidget die Verantwortung für das QLayout übernimmt. Wenn Sie das übergeordnete Element löschen, löscht es auch alle seine untergeordneten Elemente. Lesen Sie diesen Artikel für weitere Informationen.

Objektbäume und Eigentum in Qt

Diese Methode ist sehr nützlich, weil der Entwickler in herkömmlichem C ++ jedes Bit des auf dem Heapspeicher zugewiesenen Speichers verfolgen muss. Dieses Ownership-System erfordert jedoch, dass der Entwickler nur die Eltern im Auge behält.

    
Abhijith 17.05.2011 18:34
quelle

Tags und Links