PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicherverwaltung von Qt-Anwendungen



Miles
27-05-2003, 17:33
Soweit ich das überblicke ist es so, dass alle Child-Objekte, die dynamisch angefordert worden sind und die als Parent ein Widget (das Hauptwidget) haben, von selbst destruiert werden. Stimmt das soweit?

Und wie ist es jetzt mit mehreren Widgets?
Ich habe zum Beispiel in meinem Hauptwidget noch ein weiteres, dynamisches, Widget angefordert. Da kann ich als Parent aber nicht das Haupt-Widget selbst angeben, da das neue Widget sonst IN DEM Hauptwidget gezeichnet wird. Also gebe ich halt NULL an.
Aber wird dieses Fenster dann auch von selbst destruiert, wenn das Haupt-Widget geschlossen wird? Oder muss ich es erst von selbst im Destruktor des Haupt-Widgets destruieren?

tuxipuxi
27-05-2003, 18:04
die widgets werden nur wieder destruiert wenn sie im stack erstellt worden wurden(also ohne new).

wenn du sie mit new erstellt hast( was das normale vorgehen ist ), musst du sie auch selber im destruktor loeschen.

gruss,

tuxipuxi.

anda_skoa
27-05-2003, 18:14
Alle QObject mit parent werden bei Lebensende des Parent zerstört.

Aller QObject mit Parent==0 müssen natürlich selbst zerstört werden.

Wenn du ein Toplevel Window haben willst, das aber dem eigentlichen Hauptfenter untegeordnet sein soll, dann kannst du einen QDialog nehmen oder die entsprechenden Widget Flags setzen

Ciao,
_

Miles
27-05-2003, 19:46
@tuxipuxi:
Naja, soweit hab ich das auch schon gewusst. ;-) =P

@anda_skoa:
Ich frage mich wie das realisiert wird. Es wird ja im Parent nichts über die Childs gespeichert. Oder? Es wird doch anscheinend nur in den Childs gespeichert, wer ihr Parent ist. Aber woher wissen die Childs, wann der Parent destruiert wird? Oder macht das doch der Parent? Wäre toll, wenn du mir das erklären könntest. :-)

Ach ja. Und wenn ich in meinem Haupt-Widget-Parent-Dings-Bums (^_^) ein Child hab, das wiederum Parent eines weiteren Childs ist, dann wird das doch hoffentlich auch richtig destruiert, oder?

Hoffe auf Antwort. ;-)
Miles

anda_skoa
27-05-2003, 20:02
Original geschrieben von Miles
@anda_skoa:
Ich frage mich wie das realisiert wird. Es wird ja im Parent nichts über die Childs gespeichert. Oder?


Doch. Bei den Widgets muss man das ja besonders, weil Events immer auch unter Widget betreffen, zb show oder hide.



Es wird doch anscheinend nur in den Childs gespeichert, wer ihr Parent ist. Aber woher wissen die Childs, wann der Parent destruiert wird? Oder macht das doch der Parent? Wäre toll, wenn du mir das erklären könntest. :-)


Das Child trägt sich beim Parent zb in einer Child Liste ein (wie das bei Qt genau ist, weiß ich nicht, aber so hab ich es bei einem Projekt mal gemacht).
Wenn du es löscht, trägt es sich wieder aus.

Wenn der Parent gelöscht wird, iteriert er über seine Chid Liste und löscht alle Elemente.



Ach ja. Und wenn ich in meinem Haupt-Widget-Parent-Dings-Bums (^_^) ein Child hab, das wiederum Parent eines weiteren Childs ist, dann wird das doch hoffentlich auch richtig destruiert, oder?


Klar. Für den "Enkel" ist ja Child der Parent.
Das geht ganz automatisch rekursiv.

Solche Hierachien kommen praktisch eh nur bei Widgets vor, dafür dort aber sehr häufig.
Man denke an ein Hauptfenster, das einen Dialog hat, der einen ListView hat, der ListViewItems hat.

Ciao,
_

Miles
28-05-2003, 18:16
Aber wäre es auch ohne Probleme machbar, alle dynamisch erstellten Childs per Hand im Parent-Destruktor zu destruieren?
Nur so eine Frage. Das sieht einfach schöner aus und ist Balsam für mein C++-Herz. :D :p

tuxipuxi
28-05-2003, 18:48
ja,

das geht.

anda_skoa
28-05-2003, 21:04
Aber im Destruktor wird es eh ohnehin gleich automatisch gemacht.
Da bekommt nur leicht inkonsistenten Code.

Temporäre Widgets löscht man natürlich schon gleich.

Ciao,
_