У меня есть список макетов с элементами внутри. Он формирует пользовательскую таблицу.
Чтобы очистить стол, я перебираю все макеты и вынимаю предметы по одному. Затем удалите макет.
// Delete all items
QHBoxLayout* row = NULL;
while( !rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0)) != 0 )
{
QLayoutItem *item;
while ((item = row->takeAt(0)) != 0)
delete item;
delete row;
}
Это похоже на работу. Но когда я снова начинаю заполнять стол, я вижу «призраков» предметов, которые были там до чистки. В большинстве случаев они находятся между строк, за новыми объектами. И они все еще работают.
Это также происходит, когда вы используете только макет с виджетами.
Я просто хочу очистить весь макет макетов, не удаляя виджет контента. Безопасный способ очистить макет!
Вы удаляете элементы макета, но не виджеты, которыми элементы управляют. Вы должны удалить виджеты. Все элементы без макета будут автоматически удалены при удалении самого макета.
QHBoxLayout* row;
while(!rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0)))
{
QLayoutItem *item;
while ((item = row->takeAt(0))) {
// The item will be deleted when the layout itself is
// destructed. Items such as spacers will return a null
// widget, its deletion is a safe no-op.
delete item->widget();
// We don't handle recursion into sublayouts.
// We check for it so that we won't leak the layout.
Q_ASSERT(!item->layout());
}
delete row;
}
Утверждение предназначено для того, чтобы убедиться, что макет, над которым работает код, соответствует подразумеваемому предварительное условие: не должно быть вложенных макетов, так как написанный код не вписывается в них. Любые вложенные макеты с их виджетами будут иметь утечку (не утечку памяти, а утечку ресурсов). Утверждение прервет выполнение, если предварительное условие нарушено.
очистка макета может быть выполнена:
QLayoutItem* item;
while ( ( item = row->takeAt( 0 ) ) != NULL )
{
delete item->widget();
delete item;
}