Как удалить уже существующий макет на виджете? - PullRequest
12 голосов
/ 23 сентября 2011

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

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

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

Ответы [ 4 ]

15 голосов
/ 27 сентября 2011

Крис Уилсон ответил правильно, но я обнаружил, что компоновка не удаляет подуровни и 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;
15 голосов
/ 23 сентября 2011

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

delete layout;

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

3 голосов
/ 20 августа 2012

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

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

void RemoveLayout (QWidget* widget)
{
    QLayout* layout = widget->layout ();
    if (layout != 0)
    {
    QLayoutItem *item;
    while ((item = layout->takeAt(0)) != 0)
        layout->removeItem (item);
    delete layout;
    }
}
1 голос
/ 02 марта 2016

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

Это повторение текста, который я разместил здесь: https://stackoverflow.com/a/35751235/3292513

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

qDeleteAll(yourWidget->children());

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

void qDeleteAll (начало ForwardIterator, конец ForwardIterator)

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...