QT5.4 删除和删除布局中的小部件
Posted
技术标签:
【中文标题】QT5.4 删除和删除布局中的小部件【英文标题】:QT5.4 remove and delete widget in a layout 【发布时间】:2015-04-27 23:24:24 【问题描述】:我有一个QStackedLayout
,其中包含很少的QWidget
。小部件布局是QVBoxLayout
,其中也很少有QPushButton
。我想要做的是删除QStackedLayout
中的所有小部件,然后删除小部件和布局但是我希望不要删除所有按钮,因为我稍后会将它们放到另一个小部件中.
这是我的代码:
while (QLayoutItem *item = m_stacked_layout->takeAt(0))
QWidget *w = item->widget();
for (int i = 0; i < w->layout()->count(); i++)
QPushButton *button = qobject_cast<QPushButton *>(w->layout()->itemAt(i)->widget());
if (button)
w->layout()->removeWidget(button);
delete w;
delete item;
应用程序在delete w;
行崩溃。而且,如果我删除 delete
行,应用程序工作正常。
【问题讨论】:
QLayoutItem 的文档表明 QLayoutItem::widget() 更像是一个转换函数而不是返回一个成员。因此,您不应将小部件与项目分开删除。 当QLayoutItem被删除时,widget是否也被删除了。 行不通。当您将小部件添加到布局时,布局将拥有小部件的所有权。删除布局并删除小部件。 removeWidget 不会将所有权转移回来。所以无论如何你的按钮都会被删除。 【参考方案1】:但我希望不要删除所有按钮,因为我会将它们放到 稍后再添加一个小部件。
-
隐藏您要传输的所有小部件
将所有这些小部件的父小部件设置为
nullptr
稍后...设置必要的父级并显示小部件
注意:如果你想删除一些槽内的小部件,你应该使用deleteLater
方法。
【讨论】:
我将delete w
替换为w->deleteLater()
,将w->layout()->removeWidget(button)
替换为button->setParent(NULL)
,现在效果很好。当我读到deleteLater
时,一旦事件循环退出,该对象将被删除。还有其他方法可以立即删除小部件吗?顺便说一句,上面的代码是在resizeEvent
中调用的
不是在事件循环退出时。但是当它继续时。您可以阅读关于 deleteLater
+ 何时以及为何使用它的 Qt 文档。在大多数强制转换中,您可以使用 delete 运算符立即删除小部件。以上是关于QT5.4 删除和删除布局中的小部件的主要内容,如果未能解决你的问题,请参考以下文章