首页 > 其他分享 >清除 QLayout 的子成员

清除 QLayout 的子成员

时间:2023-10-30 19:22:04浏览次数:22  
标签:清除 成员 curLayout vLayout QLayout child QSpacerItem

清除布局 QLayout 中的子成员,其子成员一般为 QWidgetQLayoutQSpacerItem,如下图Layout中的成员包含: QPushButton, QHBoxLayout,QSpacerItem

其对应的创建和删除代码如下:

/// <summary>
/// 为 widget 控件添加子成员
/// </summary>
void Demo01_GUI::CreateChildItems()
{
    // 1. 创建子成员
    QPushButton* btn01 = new QPushButton("button 01");
    QPushButton* btn02 = new QPushButton("button 02");
    QHBoxLayout* subLayout01 = new QHBoxLayout();
    QHBoxLayout* subLayout02 = new QHBoxLayout();
    QSpacerItem* space = new QSpacerItem(40, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);

    // 2. 将子成员添加到Layout中
    QVBoxLayout* vLayout = new QVBoxLayout();
    vLayout->addWidget(btn01);
    vLayout->addWidget(btn02);
    vLayout->addLayout(subLayout01);
    vLayout->addLayout(subLayout02);
    vLayout->addSpacerItem(space);

    // 3. 设置当前Widget的布局为 QVBoxLayout
    ui.widget01->setLayout(vLayout);
}


/// <summary>
/// 清空 Layout 中的所有 QWidget 和 子QLayout 成员
/// </summary>
void Demo01_GUI::ClearLayoutChild()
{
    // 1. 获取当前 Widget 的布局
    QLayout* curLayout = ui.widget01->layout();

    if(curLayout == nullptr)
    {
        return;
    }

    // 2. 当前布局所包含的成员个数
    int chidItemCount = curLayout->count();
    if(chidItemCount == 0)
    {
        return;
    }

    // 3. 获取当前布局中的 QWidget, QLayout和 QSpacerItem 成员,并将其删除
    QLayoutItem* child;
    while((child = curLayout->takeAt(0)) != 0)
    {
        QWidget* widget = child->widget();
        QLayout* layout = child->layout();
        QSpacerItem* sp = child->spacerItem(); // 当其它成员都被删除后,QSpacerItem 默认会被删除,因此可以省略对该控件的操作

        if(widget != nullptr)
        {
            curLayout->removeWidget(widget);
            delete widget;
        }

        if(layout != nullptr)
        {
            curLayout->removeItem(layout);
            delete layout;
        }

        // 删除 QSpacerItem 可省略,最后会被自动删除掉
        if(sp != nullptr)
        {
            curLayout->removeItem(sp);
            delete sp;
        }
    }
}

  1. QLayoutItem: 为 QLayout 中的所有子成员,它被 QLayout, QSpacerItem, 和 QWidgetItem所继承。也就是说 QLayout的成员只有上面的这三种,可以分别通过 widget(), layout(), spacerItem() 来获取,如果不存在则返回 nullptr
  2. 以上删除子成员的核心代码是通过一个 while 循环来实现的,虽然 QLayout的子成员都是通过 QLayoutItem*表示,但是在删除的时候必须要获取到 Item 中的具体 QWidget,或 QLayout ,不能直接调用 curLayout->removeItem(child)来删除 QLayoutItem,如下的方式只是让子成员不属于 QLayout,但该成员依然存在。
while((child = curLayout->takeAt(0)) != 0)
{
   // 该方案只是将当前的 Layout 中的子成员从父控件中删除,但是对应的对象还存在,只是没有布局了。
   // 此时该控件的成员个数为0,但子控件依然会混乱的显示。
   curLayout->removeItem(child);
   delete child;
}

标签:清除,成员,curLayout,vLayout,QLayout,child,QSpacerItem
From: https://www.cnblogs.com/Jeffxu/p/17798588.html

相关文章

  • git:清除所有历史提交记录,保留文件为新库(不建议)
    #清理前查看gitloggitrev-list--objects--all......
  • 【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )
    文章目录一、继承机制中派生类中的static关键字1、子类继承父类静态成员2、父类静态成员访问控制权限的改变3、子类如何访问父类静态成员4、静态成员使用要点二、完整代码示例一、继承机制中派生类中的static关键字1、子类继承父类静态成员子类继承父类静态成员:父类(......
  • vue el-select 下拉菜单 数据回显不在清除数据可编辑状态
    思路:当点击options的时候,让select失去焦点(跳到其他的地方),添加el-input就是为了把光标跳转到其上面,然后将其隐藏掉,则为看不到光标点,但是在点击第一次之后获取焦点focus之后,隐藏掉下拉菜单的时候@blur是无效的,此时只能通过监听下拉框是否是隐藏和显示状态来让其失去焦点事件,所以......
  • 不清除手机数据怎么解锁锁屏密码
    不清除手机数据怎么解锁锁屏密码在现代社会中,手机已经成为我们生活中不可或缺的一部分。然而,有时我们可能会遇到忘记锁屏密码的情况,这可能会让我们感到困惑和焦虑。对于那些不希望丢失手机数据的人来说,不清除手机数据来解锁锁屏密码是一个不错的选择。下面我将介绍一些方法来帮......
  • 安防视频监控平台EasyCVR查询告警后,无法自动清除记录该如何优化?
    视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控平台EasyCVR支持多种播放协议,包括:HLS、HTT......
  • Java基础 File 常见的成员方法(获取并遍历)—— listFiles ()
    public File[] listFiles()  →  获取当前该路径文件夹下所有内容,把所有的内容放到数组中返回Filef=newFile("E:\\Java基础资料");File[]files=f.listFiles();for(Filefile:files){//file依次表示Java基础资料文件夹里面的每一个文件或者文件夹Sys......
  • Java基础 File 常见的成员方法(创建、删除)
     createNewFile() 方法:细节一:如果当前路径表示的文件不存在,则创建成功,方法返回true;如果当前路径表示的文件已经存在,则创建失败,方法返回false细节二:如果父级路径是不存在的,那么方法会有IOException异常细节三:createNewFile() 方法创建的一定是文件。如果路径当中不......
  • Java基础 File 常见的成员方法(判断、获取)
     length()方法的细节:只能获取文件的大小,单位是字节。如果我们想要的单位是M,G等,可以不断地除以1024       len/1024:KB  len/1024/1024:MB  len/1024/1024/1024:G如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小都累加在......
  • 成员内部类
    packagecom_black.InnerClass.s1;publicclassOuter{privateints=10;/*publicclassInner{publicvoidshow(){System.out.println(s);*/privateclassInner{publicvoidshow(){System.out.print......
  • SQL Server清除数据中的回车符、换行符、制表符
    在SQLServer中,回车符的AASCII码是13,换行符的ASCII码是10,制表符t的ASCII码CHAR(9)1,回车符查找有回车符的内容selectid,themefromTableNamewherecharindex(char(13),theme)>0清除回车符updateTableNamesettheme=replace(theme,char(13),'')where1=12,换行符查找有......