QLayout动态布局(清空布局)

    新写的程序需要动态的改变窗口数量,需要清理原有窗口。在windows下写好代码后放入linux下崩溃。查看Qt文档才发现是写法不规范的问题。

先直接摆最终写法:
    QLayoutItem *item = mainLayout->takeAt(0);
    while(item != 0)
    {
        if(item->widget())
        {
            mainLayout->removeItem(item);//A
            delete item;
        }
        item = mainLayout->takeAt(0);
    }
  

以下是几次错误尝试(直接从A处写):

1、最早是从网上找到的资料,先隐藏窗口,再删除。

{
    item->widget()->setVisible(false);
     delete item->widget();
}绕过布局直接删除widget,windows下不会出错,但Linux会崩溃

2、查看Qt文档后,使用removeWidget


     mainLayout->removeWidget(item->widget());
     delete item->widget();
     printf("after remove widget item value %d\n",item);
}利用removeWidget移除窗口后删除不会报错,但打印后发现item地址还是不变的,说明item还是在的。虽然不清楚qt内部机制,但还是处理干净好一些。

tips:Qt文档中removeItem和removeWidget都有一段话:

It is the caller's responsibility to delete the item.

可见removeItem和removeWidget仅仅将widget/item移除出布局。如果被移除的窗口不需要使用,应当删除。

 

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值