Очистка макета Qt и добавление других виджетов не работает. Призрачные виджеты остаются. Qt ошибка?

У меня есть список макетов с элементами внутри. Он формирует пользовательскую таблицу.

Чтобы очистить стол, я перебираю все макеты и вынимаю предметы по одному. Затем удалите макет.

  // 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;
}

Это похоже на работу. Но когда я снова начинаю заполнять стол, я вижу «призраков» предметов, которые были там до чистки. В большинстве случаев они находятся между строк, за новыми объектами. И они все еще работают.

Это также происходит, когда вы используете только макет с виджетами.

Я просто хочу очистить весь макет макетов, не удаляя виджет контента. Безопасный способ очистить макет!

2

Решение

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

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;
}

Утверждение предназначено для того, чтобы убедиться, что макет, над которым работает код, соответствует подразумеваемому предварительное условие: не должно быть вложенных макетов, так как написанный код не вписывается в них. Любые вложенные макеты с их виджетами будут иметь утечку (не утечку памяти, а утечку ресурсов). Утверждение прервет выполнение, если предварительное условие нарушено.

5

Другие решения

очистка макета может быть выполнена:

QLayoutItem* item;
while ( ( item = row->takeAt( 0 ) ) != NULL )
{
delete item->widget();
delete item;
}
2

По вопросам рекламы [email protected]