Есть QScrollArea или любой другой виджет. В него добавляются другие виджеты и, соответственно, рисуются на нем. После, этот виджет очищается (удаляются все виджеты на нем), и в него добавляются новые. Но при это не очищается то, что уже вывелось на экран и все выводится поверх старого.
Как визуально очистить виджет?
QLayout* scrollLayout = scroll->layout();
for(int i = 0; i < scrollLayout->count(); ++i)
{
delete scrollLayout->takeAt(i);
}
В приведенном фрагменте:
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 также содержит вложенные элементы слоя, то необходимо проходиться и по ним (можно сделать функцию очистки рекурсивной).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей