Qt入门教程【Core篇】Layout布局(布局管理器、手动布局)

😈「编程小鱼酱秘密基地」:传送门
😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「网易云课堂」:传送门
😈「CSDN学院」:传送门
😈「51CTO学院」:传送门
😈「本文的内容」:Qt布局指南
😈「动动你的小手」点赞👍收藏⭐️评论📝

文章目录

  • 1.布局简介
  • 2.常用布局方法
    • 2.1绝对位置定位
    • 2.2手动布局
    • 2.3布局管理器
        • 2.4.1水平布局类QHBoxLayout
        • 2.4.2垂直布局类QVBoxLayout
        • 2.4.3网格布局类QGridLayout
        • 2.4.4表格布局类QFormLayout
        • 2.4.5分组布局类QStackLayout
        • 2.4.6QSpliter分割器
        • 2.4.7 弹簧
  • 3.QWidget大小策略
  • 4.QLayout大小策略
  • 5.Layout核心API
    • 5.1继承关系
    • 5.2QBoxLayout
    • 5.3QGridLayout
  • 6.Qt界面设计师技巧
    • 6.1栅格化布局(表格布局)
    • 6.2巧用比例
    • 6.3巧用弹簧

1.布局简介

界面开发首先要对整个界面进行布局,使窗体上的所有的控件必须有一个合适的尺寸和位置。那么做出来的界面才看起来美观。

2.常用布局方法

2.1绝对位置定位

说明:控件布局是固定位置,没有自适应功能,只能固定窗口大小。

优点:简单

缺点:没法自适应,一拉就变形,窗口要固定大小。

QWidget *pWidget = new QWidget;
QLabel label(pWidget);
label.setText("姓名");
label.setGeometry(10,10,20,20);QLineEdit namedLineEdit("小王",pWidget);
namedLineEdit.setGeometry(35,10,50,20);
QPushButton *btn = new QPushButton("关闭",pWidget);
btn->setGeometry(90,10,40,20);

效果图:
在这里插入图片描述

2.2手动布局

说明:给出控件的绝对位置,但是他们的尺寸根据窗口的大小确定,可以通过重写窗体控件的resizeEvent()实现对子控件的大小和位置

优点:简单,灵活

缺点:虽然可以自适应,要写大量自适应的代码,很难受。

2.3布局管理器

说明:给出控件的绝对位置,但是他们的尺寸根据窗口的大小确定,可以通过重写窗体控件的resizeEvent()实现对子控件的大小和位置

优点:简单,灵活,高效,能满足你百分之99的需求

缺点:有点难,布局管理器入门有一定难度

布局管理器继承于QLayout,并非QWidght。QLayout的能力是收容QWidget,是QWidget的容器。

2.4.1水平布局类QHBoxLayout

包含的对象都横向排列开

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o0p7r96B-1642040003827)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220113091920109.png)]

2.4.2垂直布局类QVBoxLayout

包含的对象都垂直排列开

在这里插入图片描述

2.4.3网格布局类QGridLayout

将控件放置到网格中布局,它本身会从父窗口或父布局中占据尽可能多的界面空间,然后把自己的空间划分为行和列,再把每个控件塞到设置好的一个或多个单元格中。通常情况下 QGridLayout不需要自己添加空白条 QSpacerItem,因为其他功能控件把各自的单元格占据之后,剩下没控件占据的单元格自然就是空的,空的格子默认里面什么都没有,也没有空白条。

在这里插入图片描述

2.4.4表格布局类QFormLayout

专门用于管理输入控件和与之相关的标签等表单布局,QFormLayout固定为两列布局,并针对表单做了建模,配套了一堆方便使用的函数。网格布局器的基本单元是单元格,而表单布局器的基本单元是行。表单布局器是高度建模并封装的,它没有 addWidget()和 addLayout()之类的函数,它只有addRow()函数。表单布局器中一行的空间可以由多个控件占据,也可以由一个控件占据。

在这里插入图片描述

2.4.5分组布局类QStackLayout

把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其他组或者页上的控件

在这里插入图片描述

在这里插入图片描述

2.4.6QSpliter分割器

拆分器允许用户通过拖动它们之间的边界来控制子小部件的大小。任何数量的小部件都可以由单个拆分器控制。 也就是可以拖动控件的大小。

在这里插入图片描述

2.4.7 弹簧

弹簧的功能主要是站位,我在一个垂直布局中,想让一个按钮在最下面,我们就可以用弹簧实现。

在这里插入图片描述

3.QWidget大小策略

基本上所有控件都继承于QWidget吧,这些属性是通用的

常量描述
QSizePolicy::Fixed只能使用sizeHint()提供的值,无法伸缩
QSizePolicy::MinimumsiziHint()提供的大小是最小的,部件可以被拉伸
QSizePolicy::MaximumsizeHint()提供的是最大大小,部件可以被压缩
QSizePolicy::PreferredsizeHint()提供的大小是最佳大小,可以拉伸可以压缩
QSizePolicy::ExpandingizeHint()提供的是合适的大小,部件可以被压缩,不过更倾向于拉伸来获得更多的空间
QSizePolicy::MinimumExpandingsizeHint()提供的大小是最小的,部件倾向于被拉伸来获取更多的空间
QSizePolicy::IgnoredsizeHint()的值被忽略,部件将尽可能的被拉伸来获取更多的空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YlgYyqFf-1642040003830)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220113095333554.png)]

4.QLayout大小策略

所有的布局管理器类都继承于Lauout,所以都带下面的属性

属性说明
layoutName现在所使用的布局管理器的名称
layoutLeftMargin设置布局管理器到界面左边界的距离
layoutTopMargin设置布局管理器到界面上边界的距离
layoutRightMargin右边界
layoutBottomMargin 下边界
layoutSpacing布局管理器各个子部件间的距离
layoutStretch伸缩因子
layoutSizeConstraint设置大小约束条件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MjRVY78K-1642040003830)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220113095352541.png)]

5.Layout核心API

5.1继承关系

QLayout布局管理器基类
QBoxLayout盒布局
QHBoxLayout水平布局
QVBoxLayout垂直布局
QGridLayout网格布局
QFormLayout表格布局

QHBoxLayout和QVBoxLayout API没什么介绍的,因为都是QBoxLayout来实现的。所有API都写,我就累死了。所以我就画重点

5.2QBoxLayout

//添加一个带有缩放因子的layout
void	addLayout(QLayout *layout, int stretch = 0)
//添加一个separatorItem
void	addSpacerItem(QSpacerItem *spacerItem)
//将大小为size的不可拉伸空间(一个QSpacerItem)添加到此框布局的末尾。
//QBoxLayout提供默认的边距和间距。此功能增加了额外的空间。
void	addSpacing(int size)
//添加一个可拉伸空间
void	addStretch(int stretch = 0)
//将框限制为size大小
void	addStrut(int size)
//添加widget
void	addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())
//获取方向
QBoxLayout::Direction	direction() const
//插入小部件相关
void	insertItem(int index, QLayoutItem *item)
void	insertLayout(int index, QLayout *layout, int stretch = 0)
void	insertSpacerItem(int index, QSpacerItem *spacerItem)
void	insertSpacing(int index, int size)
void	insertStretch(int index, int stretch = 0)
void	insertWidget(int index, QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())
//设置方向
void	setDirection(QBoxLayout::Direction direction)
//设置拉伸因子相关
void	setStretch(int index, int stretch)
bool	setStretchFactor(QWidget *widget, int stretch)
bool	setStretchFactor(QLayout *layout, int stretch)
//获取拉伸因子
int	stretch(int index) const

5.3QGridLayout

//添加Item
void addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment())
//添加Layout
void addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
//添加Widget
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
//行和列的大小
QRect cellRect(int row, int column) const
//列个数
int columnCount() const
//列最小宽度
int columnMinimumWidth(int column) const
//列缩放因子
int columnStretch(int column) const
//通过索引获取item
void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const
//水平间距
int horizontalSpacing() const//获取第几行第几列的元素
QLayoutItem *itemAtPosition(int row, int column) const 
//获取网格的原点角
Qt::Corner originCorner() const
//行数量
int rowCount() const
//行最小高度
int rowMinimumHeight(int row) const
//获取行的缩放因子
int rowStretch(int row) const
//设置列的最小宽度
void setColumnMinimumWidth(int column, int minSize)
//设置垂直的缩放因子
void setColumnStretch(int column, int stretch)
//设置水平间距
void setHorizontalSpacing(int spacing)
//将网格的原点角,即位置 (0, 0) 设置为角。
void setOriginCorner(Qt::Corner corner)
//设置某一行最小高度
void setRowMinimumHeight(int row, int minSize)
//设置行所占总行的比例
void setRowStretch(int row, int stretch)
//设置垂直间距
void setVerticalSpacing(int spacing)
//垂直间距
int verticalSpacing() const

6.Qt界面设计师技巧

6.1栅格化布局(表格布局)

如图操作,这么
操作会给QFrame直接带上一个QLayout,让QLayout包裹中QFram。

自动调用gridLayout-> addWidget。
那么创建的QGridLayout会自动给一个centralwidget的父类。

//自动生成如下代码,但是在布局管理器,你只能在QFrame下挂着这个QGridLayout。
gridLayout = new QGridLayout(frame);
pushButton = new QPushButton(frame);
gridLayout->addWidget(pushButton, 0, 0, 1, 1);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50ZA4Pkl-1642040003831)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220113100200290.png)]

6.2巧用比例

QGridLayout的核心吧,就是比例
在这里插入图片描述

6.3巧用弹簧

按钮都在左边

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618510.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

前端布局 Flex(弹性)布局

1. flex布局优点 操作方便,布局极为简单,移动端应用很广泛 pc端浏览器支持情况较差 IE11或者更低版本,不支持或仅部分支持 2. flex布局原理 flex意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都…

Java BorderLayout(边框布局)布局管理器

BorderLayout BorderLayout 将容器分为 EAST 、 SOUTH 、 WEST 、 NORTH 、 CENTER五个区域,普通组件可以被放置在这 5 个区域的任意一个中 。 BorderLayout布局 管理器的布局示意图如图所示 。 当改变使用 BorderLayout 的容器大小时, NORTH 、 SOUTH …

java:布局方法(网格布局)

网格布局 一、简单说明二、关键代码三、流程图四、例子说明1. 有17个“按钮”排列(1)源码A(2)运行效果 2. 有36个“按钮”排列(1)源码B(2)源码B运行效果 3. 有12个“按钮”排列&…

Grid布局介绍

1、什么是Grid布局 ​     Grid布局即网格布局,是一种新的css模型,一般是将一个页面划分成几个主要的区域,定义这些区域的大小、位置和层次等关系,是目前唯一一种css二维布局。 2、和flex布局的区别 ​     Grid布局和fle…

Java GridLayout(网格布局)布局管理器

GridLayout(网格布局) ​ GridLayout 布局管理器将容器分割成纵横线分隔的网格 , 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时, 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLay…

css经典布局——圣杯布局

圣杯布局和双飞翼布局一直是前端面试的高频考点,圣杯布局的出现是来自由 Matthew Levine 在 2006 年写的一篇文章 《In Search of the Holy Grail》。 比起双飞翼布局,它的起源不是源于对页面的形象表达。在西方,圣杯是表达“渴求之物”的意思…

CSS响应式布局(自适应布局)

CSS 响应式布局也称自适应布局,是 Ethan Marcotte 在 2010 年 5 月份提出的一个概念,简单来讲就是一个网站能够兼容多个不同的终端(设备),而不是为每个终端做一个特定的版本。这个概念是为解决移动端浏览网页而诞生的。…

flex布局(详解)

目录 前言 一、何为Flex布局 二、基本概念 三、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 四、项目的属性 4.1 order属性 4.2 flex-grow属性 4.3 flex-shrink属性 …

Redis各类数据结构应用场景总结

Redis各类数据结构应用场景总结 引言String应用场景 List应用场景 Hash应用场景 Set应用场景 ZSet应用场景 小结 引言 实际面试过程中更多看重的是对Redis相关数据结构的活学活用,同时也可能会引申出Redis相关底层数据结构原理的实现,笔者最近面试过程中…

CSS基本布局——grid布局

grid布局简介: Grid布局是将容器划分成“行”和“列”,产生单元格,然后指定“项目所在”的单元格,可以看作是二维布局。 基本概念: 容器(container)——有容器属性项目(items&…

【CSS布局】—— flex(弹性)布局

赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏 。 文章目录 🌼前言🌻正文1、弹性盒子模型是什么&#x…

火列星屯--最强大的CSS布局方案

一、总论 首先给出结论:网格布局(Grid)是最强大的 CSS 布局方案。 虽说如此,但是仍要重视具体的应用场景,如果有其他写法可以提高代码的简洁和可读性,未必非要选择Gird不可。 网格布局就如同它的字面意思…

常见的布局方式

1.弹性布局---flex布局 弹性布局是一种常见且好用的布局方式,它可以让结构中的内容自适应不同的分辨率,简化的代码的书写。 使用方法 给父盒子加上display:flex;默认子元素不换行,如果装不开,子元素会缩小元素的宽度。 父级元…

前端开发常见的几种布局方式

作为前端开发工程师,布局方式有多种,对于不同的场景可以使用不同的布局方式,那么我们就先来简单的来了解一下,那些前端开发必须了解的布局。 一. 静态布局(static layout) 即传统的Web布局,网页…

android系统启动流程之zygote(Native)启动分析

zygote有一部分运行在native,有一部分运行在java层,它是第一个进入java层的进程 zygote在启动时,在init.${ro.zygote}.rc脚本中,里面描述了zygote是如何被启动的, 当init进程解析到zygote.rc文件时,将根据解析出来的命…

No117.精选前端面试题,享受每天的挑战和学习

文章目录 断点续传怎么做的秒传怎么实现var let const 块级作用域ts Partial Omit 怎么实现的箭头函数有哪些限制箭头函数为什么不能作为构造函数promise常用apiMap和Object的区别vue怎么实现双向绑定 断点续传怎么做的 断点续传是指在文件下载或上传过程中,当连接…

【微信小程序遇到的坑】实现跨行跨列的表格

由于微信小程序组件中不带table标签&#xff0c;所以只能自己制作一个table表格&#xff0c;并且是实现跨行跨列的复杂表格。 直接上代码&#xff0c;即可预览效果 wxml <view class"table"><view class"tr tr_title">上午8:30-11:45</vi…

50.服务程序SERVICE_STATUS、SERVICE_STATUS_HANDLE、RegisterServiceCtrlHandler、SetServiceStatus、SERVICE_TABL

我得先总结一下步骤&#xff1a; 一、在main函数中的操作 1.先创建一个main主函数&#xff0c;在main主函数中创建创建一个服务程序入口函数列的结构体并将其初始化 机构体SERVICE_TABLE_ENTRY DispatchTable[2]; 假设定义的服务入口函数是(LPSERVICE_MAIN_FUNCTION)ServiceMa…

使用 SAP WebIDE 将 SAP UI5 应用部署到 ABAP 系统时遇到的关于传输请求的错误

有朋友遇到一个在 webide 里部署 SAP UI5 应用到 ABAP Repository 里时出错的问题&#xff1a; 错误消息&#xff1a; Failed to get transports for the selected package. Request POST /webidedispatcher/destinations/LND500/sap/bc/adt/cts/transportchecks failed: Forbi…

【操作记录】CLion 中引入 Gurobi 并使用 C++ 编程

文章目录 一、前言二、具体操作2.1 创建项目2.2 修改编译工具2.3 修改 CMakeLists.txt2.4 修改 main.cpp2.5 运行测试 一、前言 虽然C编程大部分人都会选择使用VS&#xff0c;但是作为 IDEA 的长期用户&#xff0c;我还是比较习惯 JetBrains 风格的编译器&#xff0c;所以就选…