Удалить QWidgets из QLayout?

Я заполняю QVBoxLayout динамически с QWidget объекты, которые я создаю во время выполнения. Я хотел бы удалить их также во время выполнения, но как?

Я мог бы удалить виджеты один за другим:

void QLayout::removeWidget(QWidget * widget)

Можно ли как-то перебрать макет?

2 ответа

Все дороги ведут в Рим;)

Документация Qt оQLayout::takeAt состояния:

Следующий фрагмент кода показывает безопасный способ удаления всех элементов из макета:

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
    ...
    delete child;
}

Чтобы также удалить управляемый виджет, вам нужно добавить всего одну строку:

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
    ...
    delete child->widget();
    delete child;
}

Есть count метод, который возвращает количество сохраненных виджетов, и itemAt() метод, который, учитывая индекс, возвращает указатель на относительный сохраненный виджет. Вы можете получить все указатели, а затем удалить их. Сначала вы должны получить все указатели, потому что если вы удалите один из них во время подсчета, то количество сохраненных виджетов изменится во время итераций.

itemAt() получить QLayoutItem с widget метод, который извлекает сам виджет.

while (layout->count() != 0) {
  QLayoutItem *item = layout->itemAt(0);
  layout->removeWidget(item->widget());
}
Другие вопросы по тегам