16 Stimmen

Wie löscht man ein bereits vorhandenes Layout in einem Widget?

Sie müssen zunächst das bestehende Layout löschen layout()) bevor Sie setLayout() mit dem neuen Layout aufrufen können.

von http://doc.qt.io/qt-5.9/qwidget.html#setLayout

Welche Funktion wird zum Löschen des vorherigen Layouts verwendet?

20voto

perden Punkte 637

Die Antwort von Chris Wilson ist richtig, aber ich habe festgestellt, dass das Layout die darunter liegenden Sublayouts und qwidgets nicht löscht. Es ist am besten, dies manuell zu tun, wenn Sie komplizierte Layouts haben oder Sie könnten ein Speicherleck haben.

QLayout * layout = new QWhateverLayout();

// ... create complicated layout ...

// completely delete layout and sublayouts
QLayoutItem * item;
QLayout * sublayout;
QWidget * widget;
while ((item = layout->takeAt(0))) {
    if ((sublayout = item->layout()) != 0) {/* do the same for sublayout*/}
    else if ((widget = item->widget()) != 0) {widget->hide(); delete widget;}
    else {delete item;}
}

// then finally
delete layout;

15voto

Sie verwenden einfach

delete layout;

wie bei jedem anderen Zeiger, den Sie mit new .

5voto

m.w. Punkte 425

Dieser Code löscht das Layout, alle seine untergeordneten Elemente und alles innerhalb des Layouts "verschwindet".

qDeleteAll(yourWidget->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly));
delete layout();

Dies löscht alle direkt Widgets des Widgets yourWidget . Verwendung von Qt::FindDirectChildrenOnly est Wesentlich da sie das Löschen von Widgets verhindert, die Kinder von Widgets sind, die sich ebenfalls in der Liste befinden und wahrscheinlich bereits durch die Schleife innerhalb der qDeleteAll .

Hier ist die Beschreibung von qDeleteAll :

void qDeleteAll(ForwardIterator begin, ForwardIterator end)

Löscht alle Elemente im Bereich [begin, end] unter Verwendung des C++-Operators delete >. Der Elementtyp muss ein Zeigertyp sein (z. B. QWidget *).

Beachten Sie, dass qDeleteAll muss mit einem Container aus diesem Widget (nicht dem Layout) aufgerufen werden. Und beachten Sie, dass qDeleteAll löscht NICHT yourWidget - nur seine Kinder.

Nun kann ein neues Layout festgelegt werden.

4voto

dan.lipsa Punkte 81

Ich möchte das aktuelle Layout entfernen und es durch ein neues Layout ersetzen, aber alle Widgets, die vom Layout verwaltet werden, behalten. Ich habe festgestellt, dass in diesem Fall die Lösung von Chris Wilson nicht gut funktioniert. Das Layout wird nicht immer geändert.

Das hat bei mir funktioniert:

void RemoveLayout (QWidget* widget)
{
    QLayout* layout = widget->layout ();
    if (layout != 0)
    {
    QLayoutItem *item;
    while ((item = layout->takeAt(0)) != 0)
        layout->removeItem (item);
    delete layout;
    }
}

2voto

Tom Punkte 93

Von Qt6-Dokumente :

Das folgende Codefragment zeigt eine sichere Methode zum Entfernen aller Elemente aus einem Layout:

QLayoutItem *child;
while ((child = layout->takeAt(0)) != nullptr) {
    ...
    delete child->widget(); // delete the widget
    delete child;   // delete the layout item
}

Dies setzt voraus, dass takeAt() in der QLayout-Unterklasse korrekt implementiert wurde. Folgen Sie dem Link für Details.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X