QT运行程序提示QLayout: Attempting to add QLayout ““ to * ““, which already has a layout,原因分析及解决方案

1. 出现的问题:QT运行程序提示如下

在这里插入图片描述
QLayout: Attempting to add QLayout “” to FileDownload “”, which already has a layout
翻译过来就是:QLayout:正在尝试将QLayout“”添加到已具有布局的FileDownload“”

2. 原因:因为一个QWidget的对象只能设置一个布局QLayout,不能设置多个布局

在这里插入图片描述
在第一个红色框中的代码QVBoxLayout* vLayout = new QVBoxLayout(this);就已经在构造函数中为FileDownLoad的Qwidget对象设置了布局

QVBoxLayout* vLayout = new QVBoxLayout(this);

上面这行代码相当于:

QVBoxLayout* vLayout = new QVBoxLayout();
this->setLayout(vLayout);

此时已经为FileDownLoad的Qwidget对象设置了一个布局了,然而上面图片中两个绿色箭头指向的两个布局构造函数中又再次为FileDownLoad的Qwidget对象设置了布局
此时代码相当于:
在这里插入图片描述
已经设置有一个布局了,然后又设置了布局,所以出现了这个两个提示信息
QLayout: Attempting to add QLayout "" to FileDownload "", which already has a layout
QLayout: Attempting to add QLayout "" to FileDownload "", which already has a layout

怎么把这个提示去掉呢,也简单,明白了出现的原因,就好解决了

3. 解决方案

原因是重复设置布局,那就把重复设置的布局去掉,只留下一个主布局就行了
在这里插入图片描述
类似这样就不会有那个重复添加布局的提示了,关键在于一个QWidget的对象只有设置一个布局,然后在布局里面添加布局,类似于套娃,最终完成复杂的布局
有人会担心,没有为new的子布局设置父类,当前所在的QWidget的对象释放时,new的子布局会不会自动回收内存呢?也就是会不会造成内存泄露呢?我用Valgrind工具(一个linux下强大的内存检测工具,可以用来检测程序内存是否泄露)测试了几个例子,发现是不会的泄露,只要为QWidget的对象设置了布局,然后在这个布局里添加子布局,只要布局里的老大回收了,里面的小弟子布局也会跟着回收了

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值