编程学习
Qt学习12:常用Layout布局方式总结
00 分钟
2023-6-27
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛

布局管理类

布局管理器类用于对我们窗口中的控件进行排序放置。如果我们有很多的控件,那么你一定会想到我们该如何排序这些控件的位置呢,我们可以通过Layout布局管理类来自动管理我们的窗口控件布局。
它包括几个主要的布局类:
  • QBoxLayout:盒子布局
  • QGridLayout:网格布局
  • QFormLayout:表单布局
  • QStackedLayout:堆栈布局

设置布局的基本步骤:
  1. 创建控件
  1. 创建布局管理类
  1. 将控件添加到布局管理类中
  1. 设置布局管理类为此时的窗口布局(这一步可以没有,因为当第二步的时候,就可以直接设置)

BoxLayout:盒子布局

QBoxLayout可以在水平方向或垂直方向上排列控件,它分别派生了QHBoxLayoutQVBoxLayout子类。
  • QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列。
  • QVBoxLayout:垂直布局,在垂直方向上排列控件,即:上下排列。
基本函数功能:
  • addWidget:添加控件到布局中
  • addStretch:添加拉伸区域
  • addLayout:布局中添加布局,用于嵌套布局
  • insert等其他函数
基本使用:
我们可以随意拉伸:
notion image
notion image

布局嵌套

布局可以进行嵌套,因为其具有addLayout这个函数,我们可以在一个主布局中添加多个子布局,每个子布局中又含有一些控件。
例如下面的代码,我们模拟登录
  1. 首先我们创建账号标签和用户账号输入框,然后把这两个添加到一个水平布局
  1. 然后我们创建密码标签和用户密码输入框,然后把这两个添加到一个水平布局
  1. 最后我们把这两个水平布局合并到一个总的垂直布局中
水平盒子布局:QHBoxLayout
垂直盒子布局:QVBoxLayout
notion image
notion image

其他功能

我们创建五个按钮用于测试:
  • addStretch:添加拉伸条
  • setContentsMargins:设置边距
  • setStretchFactor:设置拉伸因子
  • setSpacing:设置每个控件之间距离
  • itemAt:获取布局内的控件元素
  1. 首先我们创建五个按钮控件然后把他们添加到水平布局中。
  1. 然后我们为每个控件之间添加一个拉伸区域
例如初始状态是这样的:
notion image
如果我们在
  • btn1 和 btn2 之间设置addStretch(1)
  • btn2 和 btn3 之间设置addStretch(2)
  • btn3 和 btn4 之间设置addStretch(3)
  • btn4 和 btn5 之间设置addStretch(4)
那么就会出现这样的情况:
有没有注意到他们每个之间的距离就是呈比例关系:1:2:3:4
notion image
注意到我们的 btn4 为什么其本身还会变大? 因为在 addWidget的时候我们还可以为控件设置拉伸系数
其他函数的功能请自己测试。
另外我们获取第一个按钮,并且对它进行操作,可以使用itemAt(index) 来指定获取布局中的第index个控件,从0开始,注意:addStretch创建的也是一个控件,因此要注意index的值。
获取第一个按钮itemAt获得的是QLayoutItem,需要强转为QPshButton类型。

GridLayout:网格布局

网格布局也叫格栅布局(多行多列)
他是为每个控件指定一个行和列的值进行排列的。我们看一个例子:
假如我们需要实现这样的一个窗口,那么该如何创建,使用何种布局类?
notion image
代码如下:
前面的添加控件不用多说了,我们重点关注addWidget的过程:
其构造函数如下:
  • QWidget:添加的控件
  • fromRow:在第几行
  • fromColumn:在第几列
  • rowSpan:占用几行
  • columnSpan:占用几列
  • 对齐方式
我们的GridLayout具有如下的二维的结构,当我们添加控件时需要指定其的具体位置。
上面的案例就是如下的构造,我们直接在addWidget的时候指定即可。
例如在添加图片的时候:
表示左上角坐标(0,0),占地两行两列
对于输入框,我们指定它们占地一行两列
有了这个图我们就很容易理解这些位置关系了。
notion image

3,表单布局(FormLayout)

表单布局可以请轻松的创建表单结构
主要函数和功能:
  • addRow:添加一行
在addRow中,我们可以指定标签文本(QFormLayout::LabelRole)和控件或者子布局(QFormLayout::FieldRole)
我们要创建一个登录框,我们只创建两个编辑框就行了,然后两个账号和密码的提示标签我们可以用参数一直接指定。
notion image
如果我们想要为某个控件直接设置贯穿一行,我们可以设置QFormLayout::SpanningRole 角色
其他的角色:
  • QFormLayout::LabelRole:只在标签区域
  • QFormLayout::FieldRole:只在文本区域
  • QFormLayout::SpanningRole:贯穿一整行。
设置换行策略:setRowWrapPolicy
  • QFormLayout::DontWrapRows:字段总是放在它们的标签旁边(默认样式)
  • QFormLayout::WrapLongRows:标签有足够的空间适应,如果字段对的最小大小大于可用空间,输入框会被换到下一行
  • QFormLayout::WrapAllRows:字段总是在它们的标签下面。
例如设置WrapAllRows:
notion image

StackedLayout:堆栈布局

QStackedLayout继承自QLayout。
QStackedLayout类提供了多页面切换的布局,一次只能看到一个界面。
运行如下:
点击切换按钮即可切换界面
notion image
 
 
notion image
 
notion image
 
 

QStackedWidget

提供了类似QStackedLayout更方便的组合。

QTabWidget

提供了便捷的分页显示功能,类似于编辑器中打开不同文件:
  • setTabsClosable:设置可以关闭
  • removeTab:点击关闭后关闭此Tab
效果如下:
在上面点击切换,并且可以关闭。
notion image
notion image
notion image
notion image

Splitter:分割器

splitter允许用户通过拖动子部件之间的边界来控制它们的大小
任何数量的小部件都可以由单个拆分器控制。QSplitter的典型用法是创建几个小部件并使用 insertWidget()或addWidget()添加它们。
鼠标放在中间的间隔上我们便可以左右拖动他们的距离。
notion image
 

评论
  • Twikoo
  • Valine