首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除父Widgets中的所有Widgets?

如何清除父Widgets中的所有Widgets?
EN

Stack Overflow用户
提问于 2010-10-15 15:52:19
回答 5查看 28.6K关注 0票数 22

我使用的是构造函数QWidget(QWidget *parent)。这个父小部件包含很多子小部件。我需要在运行时清除父窗口中的所有子窗口小部件。我该怎么做呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-15 16:02:55

您可以在父窗口小部件类中使用以下内容:

代码语言:javascript
复制
QList<QWidget *> widgets = findChildren<QWidget *>();
foreach(QWidget * widget, widgets)
{
    delete widget;
}
票数 -6
EN

Stack Overflow用户

发布于 2013-02-05 16:58:39

之前的答案是错误的!!您不能使用findChildren删除小部件的子项,因为qt4的findChildren 递归列出了子项。因此,您将删除子项的子项,然后可能会删除两次,这可能会使您的应用程序崩溃。

更广泛地说,在Qt中,获取QObject指针列表并逐个删除它们是危险的,因为由于父所有权机制,或者通过将destroyed()信号连接到deleteLater()插槽,销毁一个对象可能会连锁销毁其他对象。因此,销毁列表中的第一个对象可能会使下一个对象无效。

您需要按以下两种方式列出子小部件:

  • 将Qt::FindDirectChildrenOnly标志传递给findChild (当问题是用于列表项的 QLayout函数时不存在,使用QObject::which的
    • ,以及对于每个测试,如果它是使用isWidgetType()的小部件或在循环中使用findChild()的强制转换
    • ,则删除结果,直到它返回空指针
票数 27
EN

Stack Overflow用户

发布于 2014-05-13 20:17:53

要解决@galinette指出的递归问题,只需在while循环中删除小部件即可

代码语言:javascript
复制
while ( QWidget* w = findChild<QWidget*>() )
    delete w;
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3940409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档