我使用的是构造函数QWidget(QWidget *parent)。这个父小部件包含很多子小部件。我需要在运行时清除父窗口中的所有子窗口小部件。我该怎么做呢?
发布于 2010-10-15 16:02:55
您可以在父窗口小部件类中使用以下内容:
QList<QWidget *> widgets = findChildren<QWidget *>();
foreach(QWidget * widget, widgets)
{
delete widget;
}发布于 2013-02-05 16:58:39
之前的答案是错误的!!您不能使用findChildren删除小部件的子项,因为qt4的findChildren 递归列出了子项。因此,您将删除子项的子项,然后可能会删除两次,这可能会使您的应用程序崩溃。
更广泛地说,在Qt中,获取QObject指针列表并逐个删除它们是危险的,因为由于父所有权机制,或者通过将destroyed()信号连接到deleteLater()插槽,销毁一个对象可能会连锁销毁其他对象。因此,销毁列表中的第一个对象可能会使下一个对象无效。
您需要按以下两种方式列出子小部件:
发布于 2014-05-13 20:17:53
要解决@galinette指出的递归问题,只需在while循环中删除小部件即可
while ( QWidget* w = findChild<QWidget*>() )
delete w;https://stackoverflow.com/questions/3940409
复制相似问题