How to Clear all the Widgets in Parent Widgets?
To take care of the recursivity problem pointed out by @galinette you can just remove the widgets in a while loop
while ( QWidget* w = findChild<QWidget*>() )
delete w;
Previous answer is wrong!! You cannot use findChildren
to delete a widget's children, because Qt4's findChildren
recursively lists children. Therefore, you will delete children of children, which then may be deleted twice, potentially crashing your app.
More generally, in Qt, taking a list of QObject
pointers and deleting them one by one is dangerous, as destroying an object may chain-destroy other objects, due to the parent ownership mechanism, or by connecting a destroyed()
signal to a deleteLater()
slot. Therefore, destroying the first objects in the list may invalidate the next ones.
You need to list children widgets either by:
- Passing the Qt::FindDirectChildrenOnly flag to findChild if you are using Qt5 (which did not exist when the question was asked...)
- Using QLayout functions for listing items,
- Using QObject::children, and for each test if it is a widget using isWidgetType() or a cast
- Using findChild() in a loop and delete the result until it returns a null pointer