Qt动态移除布局

一般动态布局,经常删除控件的情况下用到留着备用.


void removeLayout(QWidget *wdialog, QLayout *layout) ;
void removeLayout(QWidget *wdialog, QLayout *layout) {
  wdialog->hide();
  QLayoutItem *child;
  if (layout == NULL)
    return;
  while ((child = layout->takeAt(0)) != NULL) {
    if (child->widget()) {
      child->widget()->setParent(NULL);
    } else if (child->layout()) {
      removeLayout(NULL, child->layout());
    }
    delete child;
  }
  delete layout;
}

以上代码已测试.

 

上述代码实际有个bug,最近调试内存泄露发现了问题所在,

代码没有删除layoutIteam就是child->widget(),内存每次大概泄露0.1M左右

因此做了一下修改,

void removeLayout(QWidget *wdialog, QLayout *layout) {
  wdialog->hide();
  QLayoutItem *child;
  if (layout == NULL)
    return;
  while ((child = layout->takeAt(0)) != NULL) {
    if (child->widget()) {
      child->widget()->setParent(NULL);
      delete child->widget();/* 修改备注,修复内存泄露 */
    } else if (child->layout()) {
      removeLayout(NULL, child->layout());
    }
    delete child;
    child = NULL;
  }
  delete layout;
  layout = NULL;
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值