Was ist der Zweck von QWidgets Elternteil?

8

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?

    
Blessed Geek 10.01.2012, 03:47
quelle

1 Antwort

16

Es gibt zwei Aspekte, zwei Fragen:

Speicherverwaltung

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.

GUI-Semantik

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.

    
Niklas B. 10.01.2012, 03:59
quelle

Tags und Links