Суммирование и дополнение:
Для Qt5 в одной строке:
qDeleteAll(parentWidget->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly));
Для Qt5 для большого количества детей, используя setUpdatesEnabled ():
parentWidget->setUpdatesEnabled(false);
qDeleteAll(parentWidget->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly));
parentWidget->setUpdatesEnabled(true);
Обратите внимание, что это не исключение безопасно! Хотя в настоящее время Qt, по-видимому, здесь не генерирует исключения, сигнал destroy () может быть связан с кодом, который выполняет throw, или переопределенным Object :: childEvent (QChildEvent *) может выдать.
Лучше было бы использовать вспомогательный класс:
class UpdatesEnabledHelper
{
QWidget* m_parentWidget;
public:
UpdatesEnabledHelper(QWidget* parentWidget) : m_parentWidget(parentWidget) { parentWidget->setUpdatesEnabled(false); }
~UpdatesEnabledHelper() { m_parentWidget->setUpdatesEnabled(true); }
};
...
UpdatesEnabledHelper helper(parentWidget);
qDeleteAll(parentWidget->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly));
Для Qt4:
QList<QWidget*> childWidgets = parentWidget->findChildren<QWidget*>();
foreach(QWidget* widget, childWidgets)
if (widget->parentWidget() == parentWidget)
delete widget;
Удаление из QLayout работает как в Qt4, так и в Qt5:
QLayoutItem* child;
while (NULL != (child = layout->takeAt(0))) // or nullptr instead of NULL
delete child;
QObjects (и, следовательно, QWidgets) удаляют себя (автоматически) из своих родителей в своем (QObject) деструкторе.