Was ist in Qt übergeordnet?

9

Fast jede QtWidgets-Klasse kann Eltern haben. Und normalerweise ist es optional, bei der Objektinitialisierung Eltern festzulegen. Wenn ich zum Beispiel eine Klasse erstelle, die QWidget class erbt, mache ich Folgendes im Konstruktor:

%Vor%

Ich kann Eltern festlegen oder nicht festlegen. Ich kann cancel_button als Kind von hbox festlegen. Ich kann auch cancel_button als Kind von yes_button setzen, aber ich denke, es ist eine schlechte Sache zu tun.

Was ist der Sinn dieses? Und, ist es wirklich notwendig, Eltern für jede QWidget basierte Klasse zu setzen, die ich erstelle?

    
Mas Bagol 20.05.2015, 15:32
quelle

2 Antworten

10

Neben der Unterstützung der Zeichenreihenfolge in GUI-Objekten hilft es auch bei der Speicherverwaltung, so dass beim Zerstören eines QObjects auch alle untergeordneten Elemente zerstört werden. Weitere Informationen finden Sie Ссылка . Wenn sich etwas im übergeordneten Element ändert (z. B. wenn es in der Größe geändert wird), kann es seinen Kindern mitteilen, dass sie sich auch selbst aktualisieren sollen.

Um Ihre Frage zu beantworten, müssen Sie nicht das übergeordnete Element für alles festlegen (deshalb ist es ein optionaler Parameter), aber meistens ist es besser, es richtig einzustellen.

    
Vitor 20.05.2015, 15:37
quelle
5

Erstens ist ein QWidget ein QObject und QObject s sind Knoten in einem QObject Baum. Die untergeordneten Knoten werden vom übergeordneten Speicher verwaltet, es sei denn, Sie heben die Zuordnung auf, bevor der übergeordnete Knoten die Möglichkeit dazu hat. Daher ist die Speicherverwaltung ein Grund dafür, dass Widgets oder andere QObject s ein Elternelement haben.

Zweitens sind sichtbare übergeordnete Widgets immer oberste Fenster. Umgekehrt ist es unmöglich, ein Widget ohne Top-Level zu haben, das ohne Eltern ist. Wenn Sie ein Widget ohne Eltern anzeigen, erhält es ein eigenes Fenster. Das Gegenteil ist nicht unbedingt richtig - es ist möglich, einem untergeordneten Widget ein Qt::Window -Flag zu geben, und es wird auch ein Fenster der obersten Ebene.

Die Folge ist, dass jedes Widget, das in anderen Widgets enthalten ist , ein Elternteil ist - andernfalls wäre es ein Fenster der obersten Ebene. Dieser Parent wird möglicherweise nicht explizit von Ihnen festgelegt, aber trotzdem gesetzt.

Ich denke, dass Ihre Frage wie folgt umformuliert werden kann: Wann muss ich dem Widget-Konstruktor explizit einen Elternteil geben? Die Antwort ist:

  1. Immer wenn es sich bei dem Widget um ein Fenster der obersten Ebene handelt, auf dem Sie einen übergeordneten Benutzer haben möchten. Solche Fenster unterliegen nicht der Layout-Verwaltung, daher gibt es keinen Mechanismus, um dieses übergeordnete Element für Sie festzulegen. Transiente Dialoge auf höchster Ebene müssen Eltern haben, damit sie in Bezug auf das Elternfenster richtig positioniert sind.

  2. Immer wenn Sie ein untergeordnetes Widget haben, das nicht der Layoutverwaltung unterliegt.

Widgets, die der Layoutverwaltung unterliegen, werden beim Einfügen in ein Layout übernommen:

%Vor%

Schließlich müssen nicht alle Widgets oder QObject s explizit auf dem Heap erstellt werden. Da alle QObject -abgeleiteten Klassen in Qt (und auch viele andere Klassen!) Das PIMPL-Idiom verwenden, machen Sie, wenn Sie sie einzeln auf dem Heap zuweisen, die Heap-Zuweisung zweimal . Zuerst weisen Sie die Instanz der Klasse zu - manchmal ist die Instanz so klein wie ein oder zwei Zeiger - und dann weist der Konstruktor der Klasse seine PIMPL zu. Explizite Heap-Zuweisung ist ein Fall von vorzeitiger Pessimierung.

Um diese Pessimierung zu vermeiden, sollte Ihr Widget wie folgt aussehen:

%Vor%

Wenn Sie das PIMPL-Idiom verwenden möchten, können Sie das auch tun:

%Vor%

Natürlich sollten Sie QDialogButtonBox anstelle all dessen verwenden:)

    
Kuba Ober 20.05.2015 18:05
quelle

Tags und Links