13 Stimmen

Was ist der Zweck von QWidget's parent?

Wenn ich ein Widget unterklassifiziert habe, ist das übliche Muster:

ZTabWidget::ZTabWidget(QWidget *parent):QTabWidget(parent){
  blah ... blah ...
}

Das übliche Muster ist:

WidgetB widgetb = new WidgetB(widgeta)
widgeta.addWidget(widgetb);

Ist es schädlich, wenn alle meine Widgets MainWindow als ihr jeweiliges übergeordnetes Element zugewiesen haben, obwohl die meisten dieser Widgets nach den Spuren der addWidget-Hierarchie ein anderes Widget als übergeordnetes Element von addWidget haben:

WidgetB widgetb = new WidgetB(mainWindow)
widgeta.addWidget(widgetb);

Der Grund, warum ich dies tun möchte, ist, dass mainWindow alle Hauptelemente der Anwendung enthält und dass ich alle meine untergeordneten Widgets auf diese Elemente verweisen lassen kann.

Tatsächlich denke ich an ein Proxy-Widget, das lediglich dazu dient, einige gemeinsame Referenzen zu halten und dieses Proxy-Widget als gemeinsames übergeordnetes Element für alle meine Widgets zu verwenden. Ist das ein Problem?

Wozu ist es eigentlich gut, ein Elternteil für ein QWidget registriert zu haben? Wird das Elternteil sogar intern verwendet?

Muss das addWidget-Elternteil dasselbe sein wie das Konstruktor-Elternteil?

22voto

Niklas B. Punkte 88763

Es gibt eigentlich zwei Aspekte Ihrer Fragen:

Speicherverwaltung

Die baumartige Organisation von QWidgets (und in der Tat von jedem QObjects ) ist Teil der im Qt-Framework verwendeten Speicherverwaltungsstrategie. Die Zuweisung einer QObject zu einem übergeordneten Objekt bedeutet, dass das Eigentum an dem untergeordneten Objekt auf das übergeordnete Objekt übertragen wird. Wenn das übergeordnete Objekt gelöscht wird, werden auch alle seine Kinder gelöscht. Vom docs :

QObjects organisieren sich in Objektbäumen. Wenn Sie ein QObject mit einem anderen Objekt als pa der children()-Liste des Elternteils hinzugefügt. Der Elternteil übernimmt den Besitz des Objekts, d.h. es löscht automatisch seine Kinder in seinem Destruktor. Sie können ein Objekt anhand seines Namens suchen und optional mit findChild() oder findChildren() suchen.

Das bedeutet, dass Sie Ihre Widgets auf jede Art und Weise organisieren können, die Ihnen sinnvoll erscheint (solange Sie keine Speicherlecks verursachen). Ich denke jedoch, dass es gängige Praxis ist, alle Widgets ihrem jeweiligen Container zuzuordnen (entweder explizit, oder besser, mit Methoden wie addWidget ).

Wenn ein Widget einem Widget zugewiesen ist QLayout mit addWidget wird das Eigentum an dem Widget auf das Layout übertragen (das wiederum wahrscheinlich einem anderen umgebenden Layout oder dem Hauptfenster gehört). Ja, die durch diese Methode definierte Beziehung umfasst die oben beschriebene allgemeinere Eltern-Kind-Beziehung.

Sobald das Hauptfenster zerstört wird, wird im Grunde der gesamte Baum der QObjects wird erwartungsgemäß gelöscht.

Wenn Sie also ein Objekt "elternlos" lassen, sind Sie selbst dafür verantwortlich, es zu löschen.

GUI-Semantik

Wie Frank richtig bemerkt hat, ist in manchen Kontexten die Eltern-Kind-Beziehung zwischen QWidgets hat auch eine semantische Bedeutung für den GUI-Rahmen. Ein Beispiel hierfür sind modale Dialoge, die ihren Elternteil blockieren, solange sie geöffnet bleiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X