Wenn ich ein Widget als Unterklasse verwende, ist das übliche Muster:
%Vor%Das übliche Muster ist:
%Vor%Schadet es nicht, wenn alle meine Widgets MainWindow als ihr jeweiliges Elternelement zugewiesen haben - obwohl die meisten dieser Widgets nach den Spuren der addWidget-Hierarchie ein weiteres Widget als addWidget-Eltern haben:
%Vor%Der Grund dafür liegt darin, dass mainWindow alle Hauptelemente der Anwendung enthält und dass ich jedes meiner untergeordneten Widgets auf diese Elemente verweisen kann.
Tatsächlich denke ich an ein Proxy-Widget, das lediglich einige allgemeine Referenzen enthält und dieses Proxy-Widget als gemeinsames übergeordnetes Element aller meiner Widgets verwendet. Irgendein Problem dabei?
Genau, was nutzt es, einen Elternteil für ein QWidget registriert zu haben? Wird der Elternteil sogar intern verwendet?
Muss das Elternelement addWidget dasselbe sein wie das Elternelement des Konstruktors?
Es gibt zwei Aspekte, zwei Fragen:
Die baumartige Organisation von QWidgets
(und tatsächlich von QObjects
) ist Teil der Speicherverwaltungsstrategie, die im Qt-Framework verwendet wird. Wenn Sie einem übergeordneten Objekt QObject
zuweisen, wird das Eigentum des untergeordneten Objekts auf das übergeordnete Objekt übertragen. Wenn das übergeordnete Element gelöscht wird, werden auch alle untergeordneten Elemente gelöscht. Aus den Dokumenten :
QObjects organisieren sich in Objektbäumen. Wenn Sie ein erstellen QObject mit einem anderen Objekt als Eltern, wird das Objekt automatisch Fügen Sie sich selbst zur Children () - Liste der Eltern hinzu. Der Elternteil übernimmt das Eigentum des Objekts; d.h. es löscht automatisch seine Kinder in seinem Destruktor. Sie können nach einem Objekt anhand des Namens suchen und optional eingeben Verwenden von findChild () oder findChildren ().
Dies bedeutet, dass Sie Ihre Widgets so organisieren können, wie Sie es für sinnvoll halten (solange Sie keine Speicherlecks einführen). Ich denke jedoch, dass es üblich ist, alle Widgets ihrem jeweiligen Container zuzuweisen (entweder explizit oder besser, indem Methoden wie addWidget
verwendet werden).
Wenn ein Widget einer QLayout
mit addWidget
, dann wird das Eigentum des Widgets in das Layout übertragen (das wiederum wahrscheinlich Eigentum einer anderen Umgebung ist) Layout oder das Hauptfenster). Also ja, die durch diese Methode definierte Beziehung schließt die oben beschriebene allgemeinere Eltern-Kind-Beziehung ein.
Nun, sobald das Hauptfenster zerstört ist, wird im Prinzip der gesamte Baum von QObjects
gelöscht, wie Sie es erwarten.
Wenn Sie also ein Objekt "ohne Eltern" belassen, liegt es in Ihrer eigenen Verantwortung, es zu löschen.
Wie Frank richtig bemerkt hat, hat die Eltern-Kind-Beziehung zwischen QWidgets
in einigen Kontexten auch eine semantische Bedeutung für das GUI-Framework. Ein Beispiel dafür sind modale Dialoge, die ihre Eltern blockieren, solange sie offen bleiben.