Удаление виджетов, размещенных в QLayout

389
28 декабря 2016, 04:31

Есть QScrollArea или любой другой виджет. В него добавляются другие виджеты и, соответственно, рисуются на нем. После, этот виджет очищается (удаляются все виджеты на нем), и в него добавляются новые. Но при это не очищается то, что уже вывелось на экран и все выводится поверх старого. Как визуально очистить виджет?

QLayout* scrollLayout = scroll->layout();
for(int i = 0; i < scrollLayout->count(); ++i)
{
    delete scrollLayout->takeAt(i);
}

Answer 1

В приведенном фрагменте:

QLayout* scrollLayout = scroll->layout();
for(int i = 0; i < scrollLayout->count(); ++i)
{
    delete scrollLayout->takeAt(i);
}

вы удаляете экземпляры QLayoutItem текущего слоя. Их удаление никак не влияет на жизненный цикл виджетов, размещенных в слое, поскольку они фактически принадлежат объекту scroll. Из документации:

When you use a layout, you do not need to pass a parent when constructing the child widgets. The layout will automatically reparent the widgets (using QWidget::setParent()) so that they are children of the widget on which the layout is installed.

Note: Widgets in a layout are children of the widget on which the layout is installed, not of the layout itself. Widgets can only have other widgets as parent, not layouts.

Для корректного удаления виджетов необходимо удалять их явно:

while (QLayoutItem* item = scrollLayout->takeAt(0)) {
    delete item->widget();
    delete item;
}

Если QLayoutItem также содержит вложенные элементы слоя, то необходимо проходиться и по ним (можно сделать функцию очистки рекурсивной).

READ ALSO
В файл записываются левые данные c++

В файл записываются левые данные c++

При записи в файл, помимо текста добавляются различные символы, хотя если вызывать функцию без переменной с текстом, то все хорошо

353
Слоты и сигналы Qt

Слоты и сигналы Qt

Есть виджет, назовем его Link, и окно MainWindowНужно сделать так, чтобы по нажатию на виджет Link выполнялось какое-то действие из MainWindow, например...

447
Статическая переменная map. Использование как словарь [требует правки]

Статическая переменная map. Использование как словарь [требует правки]

Использую статические открытые переменные типа QMapЗаполнение произвожу с помощью статической функции, которая возвращает QMap

376
Ошибка компиляции при обобщении типов

Ошибка компиляции при обобщении типов

Есть некоторая функция, принимающая в качестве аргумента вектор любого типа через шаблон

363