Ответ 1
Вы просто используете
delete layout;
как и любой другой указатель, созданный с помощью new
.
Сначала вы должны удалить существующий менеджер макета (возвращается layout()), прежде чем вы сможете вызвать setLayout() с новым макетом.
от http://doc.qt.io/qt-5.9/qwidget.html#setLayout
Какая функция используется для удаления предыдущего макета?
Вы просто используете
delete layout;
как и любой другой указатель, созданный с помощью new
.
Ответ Криса Уилсона правильный, но я нашел, что макет не удаляет подъязыки и 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;
Я хочу удалить текущий макет, заменить его новым макетом, но сохранить все виджеты, управляемые макетом. Я обнаружил, что в этом случае решение Криса Уилсона не работает. Макет не всегда изменяется.
Это сработало для меня:
void RemoveLayout (QWidget* widget)
{
QLayout* layout = widget->layout ();
if (layout != 0)
{
QLayoutItem *item;
while ((item = layout->takeAt(0)) != 0)
layout->removeItem (item);
delete layout;
}
}
Я знаю, что этот вопрос старый и на него дан ответ, но: поскольку QtAlgorithms предлагает qDeleteAll
, можно удалить макет, включая удаление всех его дочерних элементов с помощью одной строки.
Это повторение текста, который я разместил здесь: fooobar.com/info/123574/...
Этот код удаляет макет, все его дочерние элементы и все, что находится внутри макета, "исчезает".
qDeleteAll(yourWidget->children());
Вот описание перегруженной функции:
void qDeleteAll(ForwardIterator begin, ForwardIterator end)
Удаляет все элементы в диапазоне [начало, конец] с помощью оператора C++ delete>. Тип элемента должен быть указателем (например, QWidget *).
Обратите внимание, что qDeleteAll должен передаваться с контейнером из этого виджета (а не этого макета). И обратите внимание, что qDeleteAll НЕ удаляет yourWidget
- только его дочерние элементы.
Теперь новый макет может быть установлен.