一、介绍
布局管理器的作用是自动管理控件的位置和大小,确保它们在窗口调整大小时能够自动适应。通过使用布局管理器,可以实现界面的灵活布局和自适应性,而无需手动计算和设置控件的位置和大小。
QT界面布局一般有四种:
1. 水平布局(QHBoxLayout)
2. 竖直布局(QVBoxLayout)
3. 栅格布局(QGridLayout)
4. 分裂器布局(QSplitter)
本文章从手写代码方向讲。design界面直接点布局设置就完了
二、实现
1. 水平布局
水平布局(Horizontal Layout)是一种常见的布局管理器,用于按照水平方向排列控件。
在Qt中,可以使用QHBoxLayout
类来创建水平布局。
要包含头文件
#include <QHBoxLayout>
创建水平布局
QHBoxLayout *pHLay = new QHBoxLayout(父窗口指针);// 一般填this
以下是一个使用水平布局的简单示例:
QWidget window;
QHBoxLayout* hLayout = new QHBoxLayout(&window);
QPushButton* button1 = new QPushButton("Button 1");
QPushButton* button2 = new QPushButton("Button 2");
QPushButton* button3 = new QPushButton("Button 3");
hLayout->addWidget(button1);
hLayout->addWidget(button2);
hLayout->addWidget(button3);
window.setLayout(hLayout);
window.show();
三个按钮按照水平方向排列在窗口中。
水平布局可以根据窗口的大小自动调整控件的位置和大小,使得界面在不同尺寸的窗口上都能够适应和呈现良好的布局。
2. 垂直布局
垂直布局(Vertical Layout)是一种常见的布局管理器,用于按照垂直方向排列控件。
需要添加头文件
#include <QVBoxLayout>
在Qt中,可以使用QVBoxLayout
类来创建垂直布局。以下是一个使用垂直布局的简单示例:
QWidget window;
QVBoxLayout* vLayout = new QVBoxLayout(&window);
QPushButton* button1 = new QPushButton("Button 1");
QPushButton* button2 = new QPushButton("Button 2");
QPushButton* button3 = new QPushButton("Button 3");
vLayout->addWidget(button1);
vLayout->addWidget(button2);
vLayout->addWidget(button3);
window.setLayout(vLayout);
window.show();
三个按钮按照垂直方向排列在窗口中。
垂直布局可以根据窗口的大小自动调整控件的位置和大小,使得界面在不同尺寸的窗口上都能够适应和呈现良好的布局。
3. 栅格布局
栅格布局(Grid Layout)是一种常见的布局管理器,用于按照行列的方式排列控件。
使用需要添加头文件
#include <QGridLayout>
进入头文件可以看到QGridLayout
类中与添加控件和布局相关的几个重载函数的声明。这些函数用于向栅格布局中添加控件或者子布局,并可以指定它们在栅格布局中的位置以及跨越(占领)的行列数。
void addWidget(QWidget *w, int row, int column, Qt::Alignment = Qt::Alignment());
/* 将指定的控件w添加到栅格布局中,并指定它的位置为row行column列。通过Qt::Alignment参数可以指定控件在单元格中的对齐方式 */
void addWidget(QWidget *w, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment());
/* 将指定的控件w添加到栅格布局中,并指定它的位置为row行column列,并且指定它跨越rowSpan行columnSpan列。通过Qt::Alignment参数可以指定控件在单元格中的对齐方式 */
void addLayout(QLayout *layout, int row, int column, Qt::Alignment = Qt::Alignment());
/* 将指定的子布局layout添加到栅格布局中,并指定它的位置为row行column列。通过Qt::Alignment参数可以指定子布局在单元格中的对齐方式 */
void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment());
/* 将指定的子布局layout添加到栅格布局中,并指定它的位置为row行column列,并且指定它跨越rowSpan行columnSpan列。通过Qt::Alignment参数可以指定子布局在单元格中的对齐方式 */
对齐方式常用的:
Qt::AlignLeft // 左对齐
Qt::AlignRight // 右对齐
Qt::AlignCenter // 居中对齐
以下是一个使用栅格布局的简单示例:
QWidget window;
QGridLayout* gridLayout = new QGridLayout(&window);// 创建
QPushButton* button1 = new QPushButton("Button 1");
QPushButton* button2 = new QPushButton("Button 2");
QPushButton* button3 = new QPushButton("Button 3");
QPushButton* button4 = new QPushButton("Button 4");
gridLayout->addWidget(button1, 0, 0); // 添加到第0行第0列
gridLayout->addWidget(button2, 0, 1); // 添加到第0行第1列
gridLayout->addWidget(button3, 1, 0); // 添加到第1行第0列
gridLayout->addWidget(button4, 1, 1); // 添加到第1行第1列
window.setLayout(gridLayout);
window.show();
上述代码,你将看到四个按钮以2x2的栅格布局排列在窗口中。
栅格布局可以根据窗口的大小自动调整控件的位置和大小,使得界面在不同尺寸的窗口上都能够适应和呈现良好的布局。你可以通过指定行列的方式来控制控件在栅格中的位置。
4. 分裂器布局(QSplitter)
QSplitter
是Qt中的一个布局控件,它可以将父窗口或其他容器分割成多个可调整大小的子部件。用户可以通过拖动分割器来改变子部件之间的尺寸。
类似于WPS中的PPT编辑布局:
左边可以独立布局,右边也可以独立布局,左边整体可以向右边拉伸的类似效果。
要使用QSplitter
,首先需要包含头文件QSplitter
:
#include <QSplitter>
然后,可以创建一个QSplitter
对象,并将需要分割的子部件添加到其中。以下是一些常用的QSplitter
函数:
void addWidget(QWidget *widget);// 将一个子部件添加到QSplitter中。
void insertWidget(int index, QWidget *widget);// 将一个子部件插入到指定位置的QSplitter中。
void setSizes(const QList<int> &sizes);// 设置每个子部件的初始大小,sizes列表中的值表示每个子部件的像素大小。
void setCollapsible(int index, bool collapsible);// 设置指定索引的子部件是否可折叠。
void setOrientation(Qt::Orientation orientation);// 设置QSplitter的分割方向,可以是水平(Qt::Horizontal)或垂直(Qt::Vertical)。
下面是一个简单的示例代码,演示如何使用QSplitter
:
QSplitter* pSplitter = new QSplitter(this);
QWidget* pWidget1 = new QWidget(pSplitter);
QWidget* pWidget2 = new QWidget(pSplitter);
pSplitter->addWidget(pWidget1);
pSplitter->addWidget(pWidget2);
pSplitter->setOrientation(Qt::Horizontal);
QList<int> sizes;
sizes << 200 << 400;
pSplitter->setSizes(sizes);
// 添加布局和控件到子部件中
// ...
setCentralWidget(pSplitter);
在这个示例中,创建了一个QSplitter
对象pSplitter
,并创建了两个子部件pWidget1
和pWidget2
。使用addWidget
函数将两个子部件添加到QSplitter
中,并使用setOrientation
函数设置为水平分割。
setSizes
函数设置了初始的子部件大小,这里第一个子部件大小为200像素,第二个子部件大小为400像素。
最后,使用setCentralWidget
函数将QSplitter
设置为主窗口的中央部件。
通过使用QSplitter
,你可以方便地实现可调整大小的分割布局,以适应不同的用户界面需求。
构造默认生成水平分裂器,可以设置水平分裂或垂直分裂
QSplitter* pSplitter = new QSplitter(Qt::Vertical, this);// 垂直分裂器
5. 布局常用方法
a. 往布局里面添加控件
布局指针->addWidget(控件指针);
b. 可以往里面添加布局
布局指针->addLayout(添加的布局指针);
想添加多少取决于你
c. 设置布局管理器中控件之间的间距
假设我们有一个垂直布局管理器vLayout
,并且想要设置控件之间的间距为10像素,可以使用以下代码:
vLayout->setSpacing(10);
想知道默认间距,可以输出查看:
qDebug() << vLayout->spacing();// 一般是7
也可以增加间距
vLayout->addSpacing(数值);// 可以是负值
d. 设置布局管理器跟外面的边距
在使用布局管理器时,通过调用布局对象的setMargin()
方法,可以设置布局的边距。边距是指布局与容器(如窗口或父级布局)之间的空白区域。该方法接受一个整数参数,表示边距的大小(单位为像素)。默认情况下,布局的边距为0。
假设我们有一个垂直布局管理器vLayout
,并且想要设置布局与容器之间的边距为10像素,可以使用以下代码:
vLayout->setMargin(10);
还有一个,setContentsMargins()
方法,可以设置布局管理器内部控件与容器边缘之间的边距。该方法接受四个整数参数,分别表示左、上、右、下四个方向的边距大小(单位为像素)。默认情况下,布局管理器内部的边距为0。
vLayout->setContentsMargins(10, 10, 10, 10);
e. 添加一个伸缩项(弹簧)
在使用布局管理器时,通过调用布局对象的addStretch()
方法,可以向布局中添加一个伸缩项。伸缩项是一种特殊的控件,它会占据布局中的额外空间,并根据需要拉伸或收缩,以填充布局中的剩余空间。
通常情况下,伸缩项会被用于实现控件在界面中的弹性布局。例如,当窗口大小发生变化时,伸缩项可以自动调整大小,使得其他控件能够占据合适的空间,从而实现界面的自适应布局效果。
以下是一个简单的示例,演示了如何在水平布局中添加一个伸缩项:
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(someWidget1);
hLayout->addWidget(someWidget2);
hLayout->addStretch(); // 添加一个伸缩项
hLayout->addWidget(someWidget3);
在上述示例中,addStretch()
函数将在布局中添加一个伸缩项,使得someWidget1
和someWidget2
之间的空间能够弹性调整,以适应布局的变化。
注意setLayout函数
setLayout(QLayout *layout)
是QWidget
类的一个成员函数,用于设置当前窗口部件的布局管理器为指定的layout
。
如果当前窗口部件已经有一个布局管理器,则无法再安装另一个。在调用setLayout()
之前,你必须先删除现有的布局管理器(使用layout()
函数获取并删除)。
QLayout* oldLayout = widget->layout();// 获取之前的布局管理器
if (oldLayout != nullptr) {
delete oldLayout;
}
如果layout
是另一个窗口部件上的布局管理器,setLayout()
将移动并重新设置该布局管理器,使其成为当前窗口部件的布局管理器。
以下是示例代码,演示如何使用setLayout()
设置窗口部件的布局:
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(formWidget);
setLayout(layout);// 设置为当前窗口部件的布局