Qt布局管理详解(5种布局控件)_qt layerbox 填充,职场中的中年危机

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

QVBoxLayout()
QVBoxLayout(QWidget *parent)

创建 QVBoxLayout 控件的同时可以指定父窗口,那么它将作为父窗口中管理其它控件的工具;也可以暂时不指定父窗口,待全部设置完毕后再将其添加到某个窗口中。

QVBoxLayout 类没有新增任何成员方法,它只能使用从父类继承的成员方法,下表给大家罗列了常用的一些:

表 1 QVBoxLayout常用方法 成员方法 功 能

void QBoxLayout::addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())向布局管理器中添加指定的 widget 控件。 默认情况下,stretch 拉伸系数为 0,表示 widget 控件的尺寸为默认值;alignment 是一个枚举类型参数,默认值也是 0,表示该控件会填满占用的整个空间。
void QBoxLayout::addStretch(int stretch = 0)添加一个空白行,整个窗口中除了控件占用的区域外,其它区域可以由多个(≥0)空白行分摊,分摊比例取余于各个空白行设置的 stretch 参数的值。 strech 参数的默认值为 0,表示当窗口很小时,空白行可以不占据窗口空间。当窗口中包含多个 strech 值为 0 的空白行时,它们会平分窗口中的空白区域。
void QBoxLayout::addSpacing(int size)添加一个 size 大小的固定间距。
void QLayout::setMargin(int margin)设置布局管理器中所有控件的外边距,上、下、左、右外边距的大小都为 margin。默认情况下,所有方向的外边距为 11 px。
void QLayout::setContentsMargins(int left, int top, int right, int bottom)设置布局管理器中所有控件的外边距,和 setMargin() 的区别是,此方法可以自定义上、下、左、右外边距的值。
void QBoxLayout::setDirection(Direction direction)设置布局管理器中控件的布局方向,Direction 是一个枚举类型,对于 QVBoxLayout 布局管理器,direction 参数的值通常选择 QBoxLayout::TopToBottom(从上到下依次摆放)或者 QBoxLayout::BottomToTop(从下到上依次摆放)。
bool QBoxLayout::setStretchFactor(QWidget *widget, int stretch)设置布局管理器中某个控件的拉伸系数。
bool QBoxLayout::setStretchFactor(QLayout *layout, int stretch)布局管理器内部可以再放置一个布局管理器,该方法用来设置内部某个布局管理器的拉伸系数。

举个简单的例子:

#include
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建主窗口
QWidget widget;
widget.setWindowTitle(“QVBoxLayout垂直布局”);
//创建垂直布局管理器
QVBoxLayout *layout=new QVBoxLayout;
//设置布局管理器中所有控件从下往上依次排列
layout->setDirection(QBoxLayout::BottomToTop);

//连续创建 3 个文本框,并设置它们的背景和字体大小
QLabel lab1(“Label1”);
lab1.setStyleSheet(“QLabel{background:#dddddd;font:20px;}”);
lab1.setAlignment(Qt::AlignCenter);
QLabel lab2(“Label2”);
lab2.setStyleSheet(“QLabel{background:#cccccc;font:20px;}”);
lab2.setAlignment(Qt::AlignCenter);
QLabel lab3(“Label3”);
lab3.setStyleSheet(“QLabel{background:#ffffff;font:20px;}”);
lab3.setAlignment(Qt::AlignCenter);

//将 3 个文本框和 2 个空白行添加到管理器中,它们的伸缩系数比是 2:1:2:3:3
layout->addStretch(2);
layout->addWidget(&lab1,1);
layout->addWidget(&lab2,2);
layout->addWidget(&lab3,3);
layout->addStretch(3);

//将布局管理器添加到 widget 窗口中
widget.setLayout(layout);
widget.show();
return a.exec();
}

程序中做了以下几个操作:

  • 通过调用 setDirection() 方法,将添加到 QVBoxLayout 管理器中的所有控件(包括空白行)按照从下到上的顺序依次摆放。举个例子,由于 lab1 文本框是第二个添加到管理器中的,因此在最终显示的界面中,lab1 位于倒数第二的位置。
  • 通过调用 addStrech() 方法,向管理器中先后添加了两个空白行,它们的伸缩系数分别为 2 和 3,因此 widget 窗口中的空白区域会平均分为 5 份,一个空白行占 3 份,另一个占 2 份。
  • 通过调用 addWidget() 方法,向管理器中先后添加了 3 个文本框,它们的拉伸系数比为 1:2:3,所以当我们拉伸 widget 窗口时,三个文本框的大小(宽度)呈现 1:2:3 的关系。
  • 通过调用 setLayout() 方法,成功地将 layout 布局管理器添加到了 widget 窗口中。当然,也可以在创建 layout 对象时指定 widget 作为它的父窗口,两种方式是完全等价的。

执行结果为:

img
图 3 QVBoxLayout 实例演示

QHBoxLayout水平布局

水平布局指的是将所有控件从左到右(或者从右到左)依次摆放,例如:

img
图 4 QHBoxLayout水平布局

使用 QHBoxLayout 水平布局控件,程序中要提前引入<QHBoxLayout>头文件。QHBoxLayout 和 QVBoxLayout 继承自同一个类,它们的用法非常相似,比如 QHBoxLayout 类也提供了两个构造函数:

QHBoxLayout()
QHBoxLayout(QWidget *parent)

QHBoxLayout 类也没有新添任何成员方法,它只能使用从父类继承的成员方法。因此,表 1 中罗列的所有成员方法也同样适用于 QHBoxLayout 对象。

注意,当 QHBoxLayout 对象调用表 1 中的 addStretch() 方法时,表示添加一个空白列。

举个简单的例子:

#include
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建主窗口
QWidget widget;
widget.setWindowTitle(“QHBoxLayout水平布局”);
//创建水平布局管理器
QHBoxLayout *layout=new QHBoxLayout;
//设置布局管理器中所有控件的布局方向为从右往左依次排列
layout->setDirection(QBoxLayout::RightToLeft);
//连续创建 3 个文本框,并设置它们的背景和字体大小
QLabel lab1(“Label1”);
lab1.setStyleSheet(“QLabel{background:#dddddd;font:20px;}”);
lab1.setAlignment(Qt::AlignCenter);
QLabel lab2(“Label2”);
lab2.setStyleSheet(“QLabel{background:#cccccc;font:20px;}”);
lab2.setAlignment(Qt::AlignCenter);
QLabel lab3(“Label3”);
lab3.setStyleSheet(“QLabel{background:#ffffff;font:20px;}”);
lab3.setAlignment(Qt::AlignCenter);
//将 3 个文本框和 2 个空白列添加到管理器中,它们的拉伸系数比是 2:1:2:3:3
layout->addStretch(2);
layout->addWidget(&lab1,1);
layout->addWidget(&lab2,2);
layout->addWidget(&lab3,3);
layout->addStretch(3);
//将布局管理器添加到 widget 窗口中
widget.setLayout(layout);
widget.show();
return a.exec();
}

程序执行结果为:

img
图 5 QHBoxLayout水平布局实例

图 5 中,最左侧和最右侧各添加了一个空白列,它们的伸缩比例为 3:2,即它们的宽度比为 3:2。

QGridLayout网格布局

网格布局又称格栅布局或者表格布局,指的是将一些控件按照行和列排列在窗口上,例如:

img
图 6 QGridLayout网格布局

QGridLayout 的行标和列标都从 0 开始,例如图 6 中 one 按钮的位置为 (0, 0),Four 按钮的位置为 (2, 0)。我们可以随意指定 QGridLayout 的行数和列数,各个控件可以随意摆放,必要时某些位置可以空着不用。

使用 QGridLayout 网格控件,程序中需引入<QGridLayout>头文件。每个 QGridLayout 控件都是 QGridLayout 类的一个实例对象,该类提供了两个构造函数,分别是:

QGridLayout(QWidget *parent)
QGridLayout()

QGridLayout 类提供了很多实用的成员方法,常用的如下表所示:
表 2 QGridLayout常用方法 成员方法 功 能

int QGridLayout::rowCount() const获取网格的行数。
int QGridLayout::columnCount() const获取网格的列数。
void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())将 widget 控件添加到网格中的 (row,column) 位置处,并且可以自定义该控件的对齐方式。
void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())将 widget 控件从 (fromRow, fromColumn) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该控件的对齐方式。
void QGridLayout::addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())向网格中的 (row, column) 位置处添加 layout 布局管理器。
void QGridLayout::addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())将 layout 布局管理器从 (row, column) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该布局控件的对齐方式。
void QGridLayout::setColumnStretch(int column, int stretch)给指定的第 column 列设置伸缩系数。
void QGridLayout::setRowStretch(int row, int stretch)给指定的第 row 行设置伸缩系数。
void QGridLayout::setColumnMinimumWidth(int column, int minSize)设置第 column 列的最小宽度。
void QGridLayout::setRowMinimumHeight(int row, int minSize)设置第 row 行的最小宽度。

举个简单的例子:

#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建主窗口
QWidget widget;
widget.setWindowTitle(“QGridLayout网格布局”);
//创建 4 个按钮和 1 个文本框
QPushButton *but1 = new QPushButton(“but1”);
QPushButton *but2 = new QPushButton(“but2”);
QLabel *lab3 = new QLabel(“lab”);
lab3->setStyleSheet(“QLabel{background:#dddddd;font:20px;}”);
lab3->setAlignment(Qt::AlignCenter);
QPushButton *but3 = new QPushButton(“but3”);
QPushButton *but4 = new QPushButton(“but4”);
//创建网格布局控件
QGridLayout *layout = new QGridLayout;
//向 layout 中添加控件,并指定各个控件的位置
layout->addWidget(but1, 0, 0);
layout->addWidget(but2, 0, 2);
layout->addWidget(lab3, 1, 0, 3, 3);
layout->addWidget(but3, 4, 0);
layout->addWidget(but4, 4, 2);
//将 layout 添加到 widget 窗口中
widget.setLayout(layout);
widget.show();
return a.exec();
}

程序运行结果为:

img
图 7 QGridLayout网格布局实例

图 7 中,文本框控件从 (1,0) 位置开始,占据了 3 行 3 列的表格空间。

QFormLayout表单布局

Qt 提供了很多种输入框控件,包括 QLineEdit 单行输入框、QTextEdit 多行输入框等。通常情况下,每个输入框的旁边都会附带一些文字(又称标签),用来提示用户需要输入的信息。例如,图 8 中第一个输入框的标签为 “Name”,提示用户填写自己的姓名。

img
图 8 QFromLayout表单布局

生成图 8 这样的界面,实现的方法有很多,例如:

  1. 分别创建 3 个 QLabel 控件和 3 个 QLineEdit 控件,手动指定它们的位置;
  2. 在 QHBoxLayout 中嵌套 3 个 QVBoxLayout,又或者在 QVBoxLayout 中嵌套 3 个 QHBoxLayout,然后再添加 3 个 QLabel 控件和 3 个 QLineEdit 控件;
  3. 使用 QGridLayout 创建一个 3 行 2 列的表格,向表格中添加 3 个 QLabel 控件和 3 个 QLineEdit 控件。
  4. 使用 QFormLayout 表单布局控件实现。

第 1 种方法最大的弊端在于,各个控件的尺寸都是固定的,不会随着父窗口尺寸的改变而改变。第 2、3、4 种方法都是借助布局控件实现的,各个控件的尺寸可以自动调整,但前两种方法需要手动设置每一列的 strech 拉伸系数,而第 4 种方式不需要。总之对于生成类似图 8 这样的表单窗口,建议大家使用 QFormLayout 控件,因为使用 QFormLayout 编写的代码量最少,开发效率最高。

QFormLayout 可以容纳很多个输入框以及对应的标签,并将它们从上到下依次排列在界面上(如图 8 所示)。大多数情况下,QFormLayout 底层是用 QGridLayout 网格布局管理器实现的,和后者不同的是,QFormLayout 只包含 2 列(不限制行数),且第一列放置标签,第二列放置输入框。

使用 QFormLayout 布局控件之前,程序中应引入<QFormLayout>头文件。每一个表单布局控件都是 QFormLayout 类的一个实例对象,该类仅提供了一个构造函数:

QFormLayout(QWidget *parent = Q_NULLPTR)

下表给大家罗列了操作 QFormLayout 对象常用的一些成员方法:

表 3 QFormLayout常用方法 成员方法 功 能

void QFormLayout::addRow(QWidget *label, QWidget *field)将指定的 field 控件和存储标签的 label 控件添加到表单控件中的末尾。
void QFormLayout::addRow(const QString &labelText, QWidget *field)将指定的 field 控件和 labelText 标签添加到表单控件的末尾。
void QFormLayout::insertRow(int row, const QString &labelText, QWidget *field)将指定的 field 控件和 labelText 标签插入到表单控件中指定行的位置。
void QFormLayout::removeRow(int row)删除表单控件中的指定行。
void QFormLayout::removeRow(QWidget *widget)删除表单控件中 widget 控件所在的行。
void setRowWrapPolicy(RowWrapPolicy policy)设置标签的显示格式,默认标签位于控件的左侧。 RowWrapPolicy 是 QFormLayout 中定义的枚举类型,该类型包含 3 个值:QFormLayout::DontWrapRows:标签始终在输入框的左侧;QFormLayout::WrapLongRows:根据输入框的尺寸,标签可能位于输入框的左侧,也可能位于上方;QFormLayout::WrapAllRows:标签始终在输入框的上方;
void QFormLayout::setSpacing(int spacing)将行间距和列间距设置为 spacing。

举个简单的例子:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
|
| void QFormLayout::setSpacing(int spacing) | 将行间距和列间距设置为 spacing。 |

举个简单的例子:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-T2CH5sEp-1713357355574)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值