Parent-Objekte im Zusammenhang mit Layouts

Parent-Objekte von Layouts

Layouts werden direkt auf ihre Elternobjekte angewendet. Dadurch können wir den Aufruf von setLayout() weglassen. Im QGroupBox-Beispiel haben wir dieses Feature bereits verwendet. Wichtig ist, dass das Elternobjekt bereits ein gültiges Widget ist, damit es nicht zu folgenden Fehlern kommt:

#include <QPushButton>
#include <QVBoxLayout>
#include <QApplication>
 
int main( int argc, char *argv[] )
{
  QApplication app( argc, argv );
  QWidget *w;
  QPushButton *button1, *button2;
  QVBoxLayout *layout;
 
  button1 = new QPushButton( "Button 1" );
  button2 = new QPushButton( "Button 2" );
  layout = new QVBoxLayout( w );
  layout->addWidget( button1 );
  layout->addWidget( button2 );
  w = new QWidget();
 
  w->show();
 
  return app.exec();
}

Dieses Programm stürzt natürlich sofort ab, da in der Widget-Variable Speichermüll steht.

Parent-Objekte bei der Verwendung von Layouts

Layouts geben auch automatisch die Elternschaft über ein eingefügtes Widget an ihr eigenes Parent-Objekt weiter. Deshalb verursacht folgende Zeile, wie wir sie im Beispiel zu QGridLayout verwendet haben, kein Speicherleck:

layout->addWidget( new ... );

Der Speicher des Widgets wird von jenem Widget freigegeben, auf das das Layout angewendet wird.