Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Clear all the Widgets in Parent Widgets?

Tags:

I am using the constructor QWidget(QWidget *parent). This parent widget contains a lot of child widgets. I need to clear all the child widgets from the parent at runtime. How can I do this?

like image 844
saravanan Avatar asked Oct 15 '10 07:10

saravanan


1 Answers

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
like image 135
galinette Avatar answered Oct 15 '22 13:10

galinette