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-&gt;deleteLater(),将w-&gt;layout()-&gt;removeWidget(button) 替换为button-&gt;setParent(NULL),现在效果很好。当我读到deleteLater 时,一旦事件循环退出,该对象将被删除。还有其他方法可以立即删除小部件吗?顺便说一句,上面的代码是在resizeEvent 中调用的 不是在事件循环退出时。但是当它继续时。您可以阅读关于 deleteLater + 何时以及为何使用它的 Qt 文档。在大多数强制转换中,您可以使用 delete 运算符立即删除小部件。

以上是关于QT5.4 删除和删除布局中的小部件的主要内容,如果未能解决你的问题,请参考以下文章

pyqt - 如何从状态栏中的小部件中删除边框?

如果未动态添加,如何正确删除Kivy中的小部件

如何删除已删除的小部件的空白空间?

QGridLayout 不会返回其所有子小部件

finplot 作为布局中的小部件

如何在 Elementor 中删除小部件和布局子项之间的间隙/空间?