Layout des Central Widgets

Alles rund um die Programmierung mit Qt
Antworten
cooky1976
Beiträge: 76
Registriert: 24. Januar 2008 00:19

Layout des Central Widgets

Beitrag von cooky1976 »

Hi,

es hat mich mal wieder verschlagen ... in die unergründlichen Tiefen von QTt.

Ich habe ein QMainWindow, und ein QWidget. Das QWidget hat über einen Layoutmanager mehrere Frames beinhaltet. Nach einem Durchlauf meines Programmes, in dem die Frames mit Inhalt gefüllt werden, möchte ich den Ausgangszustand wieder herstellen. Die Frames, das Widget und das MainWindow sind Instanzvariablen. Hier etwas Code:
Header-Datei:

Code: Alles auswählen

    QWidget *mainWidget;
    QFrame *routeStreamFrame;

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    mainWidget = new QWidget();
    mainWidget->setObjectName(QString::fromUtf8("mainWidget"));
}
void MainWindow::createLayout(){
QGridLayout *mainLayout      = new QGridLayout();
routeStreamFrame = new QFrame();
...
mainLayout->addWidget(routeStreamFrame);
...
mainWidget->setLayout(mainLayout);
}
Ausschnitt aus der Layouterzeugung. Ich lösche das alles indem ich zuerst die Childs der Frames lösche, danach die Frames an sich und danach wollte ich das Layout von dem mainWidget löschen (ist keine Instanzvariable):

Code: Alles auswählen

QLayout *mainLayout = mainWidget->layout();
mainLayout->deleteLater();
Danach fluggs das neue Layout einbinden mit:

Code: Alles auswählen

mainWidget->setLayout(mainLayout);
Resultat ist, dass ich ein komplett leeres MainWindow ohne auch nur irgendein Layout habe. Selbst ein einziges LCDNumber einbinden funktioniert nicht.

Was aber funktioniert ist das mainWidget zu löschen (also das CentralWidget) und dem MainWindow ein neues CentralWidet zu übergeben. Kann mir jemand erklären warum?

Die Doku sagt darüber: (QWidget)
If there already is a layout manager installed on this widget, QWidget won't let you install another. You must first delete the existing layout manager (returned by layout()) before you can call setLayout() with the new layout.
Und zu dem CentralWidget:
Sets the given widget to be the main window's central widget.
Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.
Mir ist das allerdings überhaupt icht schlüssig, noch dazu, nachdem ich überprüft habe, ob die Instanzvariable mainWidget und der Returnwert von QMainWindow::centralWidget gleich sind.

Danke

Alexander

Nachtrag: Ein update() oder activate() brachte auch kein verwertbares Ergebnis
Antworten