Qt的UI布局以及控件间隔(Spacing)边距(Margins)

2023-05-16

替一个Widget设置布局有两种方法。

1layout 构造函数传递QWidget

QVBoxLayout* MainQVboxLayout=new QVBoxLayout(MainWidget);


2layout构造函数传递NULL,调用QWidget的setlayout设置布局

QVBoxLayout* MainQVboxLayout=new QVBoxLayout();

MainWidget->setLayout(MainQVboxLayout);


注意,当一个widget已经存在布局的时候。调用setLayout会失败,如果要设置,必须先通过Widget的 layout方法(

QLayout * layout() const
)得到原来的指针,然后删除再调用setlayout。 

Q:得到layout指针,delete后就能重新设置,不需要其他操作怎么做的?

A:widget使用setLayout的时候会检查原有的值是否为NULL,如果不为NULL就失败,delete layout的时候,析构函数会将这个layout属于的widget的这个值设置为0。

所以delete以后又可以设置了

QLayout::~QLayout()
{
    Q_D(QLayout);
    if (d->topLevel && parent() && parent()->isWidgetType() &&
         ((QWidget*)parent())->layout() == this)
        ((QWidget*)parent())->d_func()->layout = 0; //这里设置了为0
}


Q:为什么MainWindow调用setLayout失败?

A:MainWindow是一个组合体,已经包含了默认的layout,要通过setcenterwidget来操作中间的一块区域。



V H BOXlayout

在一个layout里面添加另一个layout如下

FuncBarQHboxLayout=new QHBoxLayout();
MainQVboxLayout->addLayout(FuncBarQHboxLayout);

Q: delete MainQVboxLayout的时候 FuncBarQHboxLayout会被删除吗,还是需要自己处理?

A:不需要自己处理。删除MainQVboxLayout的时候会自动删除他add的layout

QBoxLayout::~QBoxLayout()
{
    Q_D(QBoxLayout);
    d->deleteAll(); //删除了这些layout
}




在H 或者V layout里面添加一个控件调用

layout->addWidget(xxx) 这个是依照次序添加的。从左到右,从上到下。

如果有些子类已经实现了一些spacer函数,比如Vbox Hbox,那么用添加spacer用addSpacerItem

一般不直接使用layout->addItem() addItem定义了如何添加,由子类实现,通常用layoutitem封装一个widget或者spacer,把不同的类对象变成layout可以识别的

统一layoutitem,laytouitem可以容纳很多东西



弹簧控件的构造和使用

SpacerItem(w,h,hPolicy,vPolicy)

w是优先的高度h是优先的宽度

hPolicy是水平方向上的策略

vPolicy是垂直方向上的策略。

如果是水平弹簧 那么hPolicy=expanding vPolicy=minimum

如果是垂直弹簧那么hPolicy=minimum vPolicy=expanding



GridLayout 添加控件和Spacer

添加控件用AddWidget

添加Spacer用AddItem

不管用哪个函数都要了解他的四个关键参数

row               控件起始单元格的行位置

column        控件起始单元格的列位置

rowspan      控件所占的行个数

columnspan 控件所占的列个数

例如 0 0 2 1就是该控件排放在0,0起始的位置,占2行1列。

例如 2 3 4 2就是该控件排放在2,3起始的位置,占4行2列。

同时需要设置控件的Policy。



布局还有一个重要的值。是伸缩因子Stretch

Stretch反应的是控件和控件之间的比例。比如

setStretch(0,1)第0个位置的伸缩因子为1

setStretch(1,2)第1个位置的伸缩因子为2

因此第二个控件的大小尽量为第一个的两倍。只能是尽量,因为还有其他的条件限制。比如maxsize,minsize,或者fixed策略minimal策略之类的。



另外一个是调控控件的间隔和边界部分


layout可以使用 setspacing设置控件之间的间隔。gridlayout使用 setverticalspacing或者sethorizontalspacing 来设置

layout通过使用setcontentmargins来设置四周留白的间隔。


部分 Widget 可以通过setcontentmargins来设置四周留白的间隔。setcontentmargins主要是为layout设计使用的。不是所有的Widget都可以使用,有部分是可以的比如Label这一类,具体是否有用要看这个控件的具体实现。比如comboBox就是不可以的。







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt的UI布局以及控件间隔(Spacing)边距(Margins) 的相关文章

随机推荐

  • vector的capacity新增长方式(dev c++实测)

    vector的capacity 调用返回vector中最大能够存储的元素个数 xff0c 也即在下一次需要扩充容量之前能容纳的元素个数 reserve会使容器在必要的时候增长 xff0c 以便容纳制指定数目的元素 include lt io
  • Android DNS Resolver

    DNS 解析器 xff08 DNS Resolver xff09 DNS 解析器模块可保护用户免受 DNS 拦截和配置更新攻击 xff0c 并改进了 DNS 解析的网络性能 此模块包含用于实现 DNS 桩解析器的代码 xff0c 该解析器可
  • Python量化相关

    量化实例 xff1a 可转债轮动策略 LOF 封基 ETF动量策略 小市值策略 Python xff1a Python 基础教程 菜鸟教程Python 3 教程 菜鸟教程Windows搭建python开发环境 xff0c python入门到
  • Visual Basic相关

    vb教程
  • 三极管和运放构成的几种恒流源电路分析

    如何利用三极管和运放设计一个150mA的恒流源 xff0c 求电路图 xff0c 验证过的 xff01 xff01 xff01 三极管和运放构成的几种恒流源电路分析 还不是太理解 这几种电路都可以在负载电阻RL上获得恒流输出 第一种由于RL
  • AI相关资料整理

    scikit learn中文社区
  • Android开发知识备忘

    Android Studio 上jar包 xff0c aar包 xff0c aidl xff0c aidl打成aar包的正确使用Android AIDL bindService后不能调用onServiceConnected方法 xff08
  • 【C++】struct和class的区别

    在C 43 43 中我们可以看到struct和class的区别并不是很大 xff0c 两者之间有很大的相似性 那么为什么还要保留struct 这是因为C 43 43 是向下兼容的 xff0c 因此C 43 43 中保留了很多C的东西 一 首
  • MPLAB程序中如何设置配置字

    基于MPLAB X IDE配置位设置讲解 在不同的芯片中其配置字不尽相同 xff0c 但是管家最常用到的有如下几部分 xff1a 1 芯片的振荡模式 xff0c 有内外之分 xff0c 还有三个速度的选择 2 xff0c 片内看门狗的启用
  • 直流电机驱动电路设计

    http bbs ednchina com BLOG ARTICLE 177889 HTM 一 直流电机驱动电路的设计目标 在直流电机驱动电路的设计中 xff0c 主要考虑一下几点 xff1a 功能 xff1a 电机是单向还是双向转动 xf
  • 奇偶校验码

    http blog 163 com ma youzhong blog static 42459154200821785759423 老顽童 xff08 原创 xff09 二进制数据经过传送 存取等环节 xff0c 会发生误码 xff08 1
  • 串口半双工与全双工

    怎么这么多人认为 xff14 xff18 xff15 是半双工 xff1f 大家能不能看一下具体的定义啊 xff1f xff01 不要认为我们经常使用 xff14 xff18 xff15 的半双工方式就认为 xff14 xff18 xff1
  • NPN传感器PNP传感器原理和分类

    PNP与NPN型传感器其实就是利用三极管的饱和和截止 xff0c 输出两种状态 xff0c 属于开关型传感器 但输出信号是截然相反的 xff0c 即高电平和低电平 PNP输出是高电平1 xff0c NPN输出的是低电平0 PNP与NPN型传
  • Windows系统上在vscode连接服务器http-server

    1 打开vscode xff0c 创建一个HTML文件 2 查看 gt 终端 3 Windows10的终端是powershell xff0c 点击 xff0c 在下拉栏找到默认 xff0c 更改成cmd终端 4 输入 npm install
  • 精密单点定位技术(PPP)和RTK技术有什么区别

    首先用通俗的话来说 xff0c RTK是先架设一个基站 xff0c 基站把自己的误差是多少告诉我 xff0c 我再用这个误差项去消除自己移动站的误差 而PPP不用我们自己架设基站 xff0c 已经有一些基础的基站 xff0c 通过卫星发送的
  • ubuntu network manager 网络需要手工重启解决

    乌班图的无线和网络需要手工 sudo service network manager restart才可以搜索到 其实主要是我手工编辑了 etc network interface 修改的方法就是在 etc NetworkManager N
  • C#垃圾回收GC机制

    https www cnblogs com yzl050819 p 6245463 html 可以参考这篇文章的内容 程序员不能控制解构器何时将被执行因为这是由垃圾收集器决定的 垃圾收集器检查不在被应用程序使用的对象 它认为这些条件是符合清
  • 编译xlslib 测试写入中文

    1下载xlslib库 https sourceforge net projects xlslib source 61 directory 我下载的是 xlslib package 2 5 0 zip 解压 在xlslib xlslib bu
  • 电商API:拍立淘图片搜索

    item search img 按图搜索淘宝商品 xff08 拍立淘 xff09 查看演示 onebound taobao item search img 请求参数 xff1a imgid 61 http g search3 alicdn
  • Qt的UI布局以及控件间隔(Spacing)边距(Margins)

    替一个Widget设置布局有两种方法 1layout 构造函数传递QWidget QVBoxLayout MainQVboxLayout 61 new QVBoxLayout MainWidget 2layout构造函数传递NULL xff