Qt-QLayout: Attempting to add QLayout “to ***“, which already has a layout的终极解决方法
相关资料:
https://blog.csdn.net/qq_35621436/article/details/108676895
问题
最近在捣鼓QT的时候,经常遇到Qlayout布局不成功的问题,提示是要设置的部件已经有布局了。
如字面意思,这种情况就是多次设置布局引起的,那么如何解决呢?
原因以及解决方法
代码性重复设置
第一种可能就是你自己在写代码的时候重复设置了layout,有以下两种情况
1. 初始化时指定了父窗口,最后又显式调用setLayout函数
//首先创建布局的时候就指定了父窗口,那么你的部件在这里就被设置了一次布局
QVBoxLayout * lay = new QVBoxLayout(this);
/*----others-----*/
//布局设置完后,你又显式地调用部件地setLayout函数,这就重复了一次
setLayout(lay);
2. 重复调用setLayout函数
QVBoxLayout * lay = new QVBoxLayout;
lay->addWidget(ptn);
lay->addWidget(ui->pushButton);
//第一次调用
setLayout(lay);
QHBoxLayout * lay2 = new QHBoxLayout;
lay2->addWidget(ptn);
lay2->addWidget(ui->pushButton);
//第二次调用
setLayout(lay2);
那么它会应用哪种布局形式呢,第一种吗?不,测试后发现它哪种都不用,使用了默认的designer里面的布局
与Designer里的布局重复
如果你并没有在代码里重复设置过layout, 但仍有可能出现重复设置的问题,这是因为你和Designer里的布局冲突了,将designer里的布局break掉就行了。这里又分两种情况
1. 你的基类是QMainWindow类
注意了,MainWindow类它自身是有一个布局的,而且这个布局你是break不了的,一般你要设置的样式都集中在主要区域(MainWinodw分菜单区,主要区域,tool区,dock区,status区等)里,MainWindow的主要区域可以通过 centralWidget() 来获取,这个时候就给主区域设置样式即可。
QVBoxLayout * lay = new QVBoxLayout;
lay->addWidget(ptn);
lay->addWidget(ui->pushButton);
this->centralWidget()->setLayout(lay);
2. 你的基类不是QMainWinodw,也就是一个widget部件
这个时候肯定是你在designer里设置过一个布局,去designer里面break掉就行了
如图所示,打破布局的部件会像centrawidget前面的那个标志一样有个禁止的红色标志,像MainWindow自身的布局你是打破不了的。
相关文章
- QT-QT button以及label实现不规则图形(五种方法:使用QSS,设置Mask图片,自己画)
- s3c2410上搭建QT/Embedded4.8.5开发环境(二)--安装arm平台qt库qt-everywhere-opensource-src-4.8.5
- Qt音视频开发22-音频播放QAudioOutput
- Qt音视频开发04-保存音频文件(pcm/wav/aac)
- Qt编写物联网管理平台19-端口管理
- Qt通用方法及类库11
- Qt通用方法及类库6
- Qt MAF过滤的方法
- Qt QWaitCondition 的正确使用方法
- Qt 将带界面的程序封装成dll
- Qt 控制Widget窗体大小方法
- Qt 关于QT_BEGIN_NAMESPACE宏的作用
- Qt中几个函数的使用方法
- QT配置opencv_qt调用opencv
- 【Qt】在ubuntu上为可执行程序qt创建图标(亲测)
- 【Qt】解决 “ubuntu 中的 qt 编辑器光标变成小黑块”
- 【Qt】解决ubuntu中qt从一个工程去找另一个工程文件
- 9、QT基础——Qt消息机制和事件
- 3、 QT基础——第一个Qt小程序
- 1、QT基础——Qt概述
- QT里实现Windows电脑三种关机方法
- Qt之按钮相关基本操作
- QT creator使用(二):Qt项目建立、编译、运行、发布及移植