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的对象设置了布局,然后在这个布局里添加子布局,只要布局里的老大回收了,里面的小弟子布局也会跟着回收了

猜你喜欢

转载自blog.csdn.net/qq_44667165/article/details/128235724