2016-10-04 2 views
1

Einer unserer Lehrer bat uns, eine Qt-Anwendung ohne UI-Datei für das Hauptfenster (ein QMainWindow) zu erstellen. Normalerweise erstelle ich immer einen, lasse ihn leer und lasse die uic damit umgehen.Qt5 QMainWindow Komponenten löschen

Ich weiß, dass, wenn eine Elternbeziehung zwischen einem Widget (Kind) und seinem Eltern definiert ist, dann ist es nicht notwendig, das Widget zu löschen (gelöscht, wenn das Elternteil gelöscht wird). Wenn die Benutzeroberfläche gelöscht wird, werden alle untergeordneten Elemente gelöscht.

Wenn wir keine (nicht generierte) UI-Datei verwenden, müssen wir das gesamte Widget, das der GUI hinzugefügt wurde, manuell löschen?

Eine kleine Probe:

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent){ 
    layout = new QHBoxLayout(this); 
    aButton = new QButton(this); 
    layout->addWidget(aButton); 
    ... 
} 

MainWindow::~MainWindow(){ 
    delete ui; // No need to delete more if parental relation. 
    // However, what do we do if no ui has been generated? 
    // Do we have to delete aButton? 
} 

Der Wert der Mutter ist 0. Es ist der Haupteingang der Anwendung ist.

Dank

+0

Es ist eigentlich unklar, was Sie fragen, aber angenommen, 'ui' ist ein' nullptr' 'löschen ui;' ist ein NOP. Es scheint also in Ordnung zu sein. –

+0

Nun, ich fragte nach Dingen, die wir tun müssen, wenn wir keine automatisch generierte UI-Datei haben. Müssen wir jedes Widget manuell löschen? – Papipone

+1

*** Müssen wir jedes Widget manuell löschen? *** Nein. Die Widgets sollten Kinder des übergeordneten Widgets sein. QObject behandelt sie, wenn der Elternteil gelöscht wird. – drescherjm

Antwort

3

verweisen auf this article

QWidget, die grundlegende Klasse des Moduls Qt Widgets, die Beziehung Eltern-Kind erstreckt. Ein Kind wird normalerweise auch ein Kind-Widget, d. H. Es wird in seinem Eltern-Koordinatensystem angezeigt und wird durch die Grenzen seines Elternteils grafisch abgeschnitten. Wenn die Anwendung beispielsweise ein Meldungsfeld löscht, nachdem es geschlossen wurde, werden die Schaltflächen und das Label des Meldungsfelds ebenfalls gelöscht, genau wie wir es möchten, da die Schaltflächen und das Label untergeordnete Elemente des Meldungsfelds sind.

Also, es gibt keinen Unterschied verwenden Sie ui oder nicht. Wenn Sie das Fenster löschen, werden auch alle untergeordneten Elemente gelöscht.