Seite 1 von 1

[solved]Widgets aus einem QFrame mit Layoutmanager entfernen

Verfasst: 12. Mai 2009 17:00
von cooky1976
Hallo,

ich habe hier ein Layout-Problem.
Ich habe hier ein QMainWindow mit mehreren QFrames, die alle Instanzvariablen sind. In den Frames sind jeweils einige QWidgets, die auch in den QFrames mit einem Layout-Manager angeordnet worden sind.
Zu einem Zeitpunkt x möchte ich aus einem Frame alle Widgets löschen und mit Neuen bestücken:

Code: Alles auswählen

void MainWindow::deleteFrameChilds(QFrame *frame)
{
    QObjectList childs = frame->children();
    while (!childs.isEmpty())
         childs.takeFirst()->deleteLater();
}
Funktioniert soweit auch. Es werden die Anzahl der Widgets plus das Layout, das bei den children auftaucht aus dem QFrame genommen. Allerdings bringt mir QFrame->layout() noch einen Rückgabewert.
Möchte ich nun einfach ein neues QVBoxLayout mit setLayout setzen und das wieder mit Widgets füllen, bekomme ich Folgendes (von Interesse ist nur der QFrame über dem Wort Configuration):
Bild
Aussehen sollte es so:
Bild
Mein Code:

Code: Alles auswählen

    plotsLayout = new QVBoxLayout;
    plotsLayout->setAlignment(Qt::AlignTop);
    plotArea->setLayout(plotsLayout);
    plotArea->adjustSize();
Das plotsLayout ist auch eine Instanzvariable. Kann mir jemand erklären, wo mein Fehler ist, bzw. was ich machen muss, damit das funktioniert?

Ich mache dasselbe nach einem kompletten Durchlauf (aktuell müssen ein paar Frames noch während eines Durchlaufes geändert werden) und da ist bis zu der Wiederbestückung etwas mehr Zeit, da läuft alles ohne Probleme.

Danke schon mal

Alexander

Verfasst: 13. Mai 2009 18:22
von cooky1976
Hat hier überhaupt keiner einen Tipp, wie man aus einem gefüllten QWidet mit Layoutmanager wieder Widgets rausbekommt oder ist die Antwort so simpel, dass ich auf dem Schlauch stehe?

Verfasst: 13. Mai 2009 21:32
von cooky1976
Ich habe eine Lösung gefunden.

Ich brauche ja nicht zwingend einen neuen Layout-Manager. Ich kann ja den nehmen, den ich schon habe. Und daraus resultiert dann, das ich nur die QWidgets des Frames lösche. Dies geht über:
QFrame *frame (Instanzvariable)

Code: Alles auswählen

    QLayoutItem *child;
    while ((child = frame->layout()->takeAt(0)) != 0) {
        QWidget curWidget;
        if (child->widget() != 0) {
            child->widget()->close();
        }
    }