type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛
布局管理类
布局管理器类用于对我们窗口中的控件进行排序放置。如果我们有很多的控件,那么你一定会想到我们该如何排序这些控件的位置呢,我们可以通过Layout布局管理类来自动管理我们的窗口控件布局。
它包括几个主要的布局类:
- QBoxLayout:盒子布局
- QGridLayout:网格布局
- QFormLayout:表单布局
- QStackedLayout:堆栈布局
设置布局的基本步骤:
- 创建控件
- 创建布局管理类
- 将控件添加到布局管理类中
- 设置布局管理类为此时的窗口布局(这一步可以没有,因为当第二步的时候,就可以直接设置)
BoxLayout:盒子布局
QBoxLayout可以在水平方向或垂直方向上排列控件,它分别派生了
QHBoxLayout
、QVBoxLayout
子类。- QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列。
- QVBoxLayout:垂直布局,在垂直方向上排列控件,即:上下排列。
基本函数功能:
- addWidget:添加控件到布局中
- addStretch:添加拉伸区域
- addLayout:布局中添加布局,用于嵌套布局
- insert等其他函数
基本使用:
我们可以随意拉伸:
布局嵌套
布局可以进行嵌套,因为其具有
addLayout
这个函数,我们可以在一个主布局中添加多个子布局,每个子布局中又含有一些控件。例如下面的代码,我们模拟登录:
- 首先我们创建账号标签和用户账号输入框,然后把这两个添加到一个水平布局中
- 然后我们创建密码标签和用户密码输入框,然后把这两个添加到一个水平布局中
- 最后我们把这两个水平布局合并到一个总的垂直布局中
水平盒子布局:
QHBoxLayout
垂直盒子布局:
QVBoxLayout
其他功能
我们创建五个按钮用于测试:
- addStretch:添加拉伸条
- setContentsMargins:设置边距
- setStretchFactor:设置拉伸因子
- setSpacing:设置每个控件之间距离
- itemAt:获取布局内的控件元素
- 首先我们创建五个按钮控件然后把他们添加到水平布局中。
- 然后我们为每个控件之间添加一个拉伸区域。
例如初始状态是这样的:
如果我们在
- btn1 和 btn2 之间设置addStretch(1)
- btn2 和 btn3 之间设置addStretch(2)
- btn3 和 btn4 之间设置addStretch(3)
- btn4 和 btn5 之间设置addStretch(4)
那么就会出现这样的情况:
有没有注意到他们每个之间的距离就是呈比例关系:1:2:3:4
注意到我们的
btn4
为什么其本身还会变大? 因为在 addWidget的时候我们还可以为控件设置拉伸系数。其他函数的功能请自己测试。
另外我们获取第一个按钮,并且对它进行操作,可以使用
itemAt(index)
来指定获取布局中的第index个控件,从0开始,注意:addStretch创建的也是一个控件,因此要注意index的值。获取第一个按钮itemAt获得的是
QLayoutItem
,需要强转为QPshButton类型。GridLayout:网格布局
网格布局也叫格栅布局(多行多列)
他是为每个控件指定一个行和列的值进行排列的。我们看一个例子:
假如我们需要实现这样的一个窗口,那么该如何创建,使用何种布局类?
代码如下:
前面的添加控件不用多说了,我们重点关注
addWidget
的过程:其构造函数如下:
- QWidget:添加的控件
- fromRow:在第几行
- fromColumn:在第几列
- rowSpan:占用几行
- columnSpan:占用几列
- 对齐方式
我们的GridLayout具有如下的二维的结构,当我们添加控件时需要指定其的具体位置。
上面的案例就是如下的构造,我们直接在addWidget的时候指定即可。
例如在添加图片的时候:
表示左上角坐标(0,0),占地两行两列。
对于输入框,我们指定它们占地一行两列。
有了这个图我们就很容易理解这些位置关系了。
3,表单布局(FormLayout)
表单布局可以请轻松的创建表单结构。
主要函数和功能:
- addRow:添加一行
在addRow中,我们可以指定标签文本(QFormLayout::LabelRole)和控件或者子布局(QFormLayout::FieldRole)
我们要创建一个登录框,我们只创建两个编辑框就行了,然后两个账号和密码的提示标签我们可以用参数一直接指定。
如果我们想要为某个控件直接设置贯穿一行,我们可以设置
QFormLayout::SpanningRole
角色其他的角色:
- QFormLayout::LabelRole:只在标签区域
- QFormLayout::FieldRole:只在文本区域
- QFormLayout::SpanningRole:贯穿一整行。
设置换行策略:setRowWrapPolicy
- QFormLayout::DontWrapRows:字段总是放在它们的标签旁边(默认样式)
- QFormLayout::WrapLongRows:标签有足够的空间适应,如果字段对的最小大小大于可用空间,输入框会被换到下一行
- QFormLayout::WrapAllRows:字段总是在它们的标签下面。
例如设置WrapAllRows:
StackedLayout:堆栈布局
QStackedLayout继承自QLayout。
QStackedLayout类提供了多页面切换的布局,一次只能看到一个界面。
运行如下:
点击切换按钮即可切换界面。
QStackedWidget
提供了类似QStackedLayout更方便的组合。
QTabWidget
提供了便捷的分页显示功能,类似于编辑器中打开不同文件:
- setTabsClosable:设置可以关闭
- removeTab:点击关闭后关闭此Tab
效果如下:
在上面点击切换,并且可以关闭。
Splitter:分割器
splitter允许用户通过拖动子部件之间的边界来控制它们的大小。
任何数量的小部件都可以由单个拆分器控制。QSplitter的典型用法是创建几个小部件并使用 insertWidget()或addWidget()添加它们。
鼠标放在中间的间隔上我们便可以左右拖动他们的距离。
- 作者:Yuleo
- 链接:https://www.helloylh.com/article/qt12
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。