Как удалить уже существующий макет на виджете?

  Сначала вы должны удалить существующий менеджер макета (возвращается layout()), прежде чем вы сможете вызвать setLayout() с новым макетом.

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

Какая функция используется для удаления предыдущего макета?

Ответ 1

Вы просто используете

delete layout;

как и любой другой указатель, созданный с помощью new.

Ответ 2

Ответ Криса Уилсона правильный, но я нашел, что макет не удаляет подъязыки и qwidgets под ним. Лучше всего это сделать вручную, если у вас сложная компоновка или у вас может быть утечка памяти.

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;

Ответ 3

Я хочу удалить текущий макет, заменить его новым макетом, но сохранить все виджеты, управляемые макетом. Я обнаружил, что в этом случае решение Криса Уилсона не работает. Макет не всегда изменяется.

Это сработало для меня:

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

Ответ 4

Я знаю, что этот вопрос старый и на него дан ответ, но: поскольку QtAlgorithms предлагает qDeleteAll, можно удалить макет, включая удаление всех его дочерних элементов с помощью одной строки.

Это повторение текста, который я разместил здесь: fooobar.com/info/123574/...

Этот код удаляет макет, все его дочерние элементы и все, что находится внутри макета, "исчезает".

qDeleteAll(yourWidget->children());

Вот описание перегруженной функции:

void qDeleteAll(ForwardIterator begin, ForwardIterator end)

Удаляет все элементы в диапазоне [начало, конец] с помощью оператора C++ delete>. Тип элемента должен быть указателем (например, QWidget *).

Обратите внимание, что qDeleteAll должен передаваться с контейнером из этого виджета (а не этого макета). И обратите внимание, что qDeleteAll НЕ удаляет yourWidget - только его дочерние элементы.

Теперь новый макет может быть установлен.