One, delete the controls in the layout without sub-layouts:
for i in reversed(range(self.layout1.count())):#倒序删除
item = self.layout1.itemAt(i)
# print(type(item), type(item.widget()))
if item.widget():
self.layout1.itemAt(i).widget().deleteLater()
else:#当item.widget()的返回值是None时
self.layout1.removeItem(item);
Note that the return value of item.widget() may be None, so calling deleteLater() will cause problems, so don't call it in the statement if item.widget() == False:.
Second, delete the controls in the sub-layout
Here is only an example with only one layer of sub-layouts:
for i in reversed(range(self.layout1.count())):#倒序删除
item = self.layout1.itemAt(i)
# print(type(item), type(item.widget()))
if item.widget():
self.layout1.itemAt(i).widget().deleteLater()
else:
if type(item) == type(QHBoxLayout()):
# print(item.count())
for j in reversed(range(item.count())):
if item.itemAt(j).widget():
# print('到达')
item.itemAt(j).widget().deleteLater()
Note that when the child layout or the control in the layout is not a global variable, the deletion may fail.