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?
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?
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;
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.
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;
}
}
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 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.