zoukankan      html  css  js  c++  java
  • 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自身的布局你是打破不了的。

    作者:疯狂Delphi
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

    欢迎关注我,一起进步!扫描下方二维码即可加我

  • 相关阅读:
    [转]编程能力与编程年龄
    github for windows 使用
    github 改位置
    Linux下设置和查看环境变量
    Docker基础 :网络配置详解
    docker入门实战笔记
    Jenkins +Maven+Tomcat+SVN +Apache项目持续集成构建
    使用nsenter工具进入Docker容器
    Docker从入门到实战(四)
    Docker从入门到实战(三)
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/15263681.html
Copyright © 2011-2022 走看看