Qt:删除QWidget中的所有布局和组件

技术要点:

1、调用QWidget::layout()可获取组件的布局;

2、QLayout::count() 可获取布局内的子项数量,包括子布局和子组件;

3、QLayout::itemAt(int index) 可根据索引获取相应的子项;

4、QLayout::removeWidget(QWidget *widget) 可将某个组件从布局中移除。

有了上述方法,就可以实现删除QWidget中的所有布局和组件的功能了,该方法也适用于QMainWindow和QDialog,代码如下:

cpp 复制代码
#include <QWidget>
#include <QLayout>

// 清除组件内的所有元素
void removeAllWidget(QWidget *wgt)
{
    if (wgt) {
        QLayout *lay = wgt->layout();
        if (lay) {
            removeAllWidget(lay);
        }
        
        // 如果需要删除组件本身,则调用以下代码
        wgt->deleteLater();
        wgt = nullptr;
    }
}

// 清除布局内的所有元素
void removeAllWidget(QLayout *lay)
{
    if (lay) {
        // auto tmp = lay->children();
        
        while (lay->count() > 0) {
            QLayout *subLay = lay->itemAt(0)->layout();
            if (subLay) {
                removeAllWidget(subLay);    // 子布局递归调用
            }
            
            QWidget *wgt = lay->itemAt(0)->widget();
            if (wgt) {
                lay->removeWidget(wgt);
                wgt->setParent(nullptr);
                wgt->deleteLater();
                wgt = nullptr;
            }
        }
        
        lay->deleteLater();
        lay = nullptr;
    }
}
相关推荐
爱思考的小伙1 天前
Qt-02:信号与槽
开发语言·qt
森G1 天前
22、GUI控件类---------常见界面组件类
qt
森G2 天前
21、信号和槽详解---------QT基础
qt
西装没钱买2 天前
QT组播的建立和使用(绑定特定的网卡,绑定特定IP)
网络·c++·qt·udp·udp组播
森G2 天前
20、元对象系统---------QT基础
qt
Laurence2 天前
CMake 报错 Failed to find required Qt component WebEngineWidgets
qt·webengine·cmake·找不到
习惯就好zz2 天前
Qt Quick 系统托盘完整实践
开发语言·qt·qml·系统托盘·system tray·qapplication·qguiapplication
笨笨马甲2 天前
Qt集成OpenCV
开发语言·qt
笨笨马甲2 天前
Qt 工业机器视觉开发
开发语言·qt
小灰灰搞电子2 天前
Qt 打印输出:printf与qDebug的区别
开发语言·qt