QT布局管理和空间提升为和空间间隔

QHBoxLayout:按照水平方向从左到右布局;
QVBoxLayout:按照竖直方向从上到下布局;
QGridLayout:在一个网格中进行布局,类似于HTML的table;
基本布局管理类包含有以下四种:QObject下的Qt标准组件中的QBoxLayout、QGridLayout、QFormLayout与QStackedLayout四种子类对象;其中前三种组件均源自QObject(而非传统的Widget);通过层次化组合应用这四者,则可实现更为复杂的界面布局;具体而言,在这一系列组件中;QBoxLayout提供了一种线性化的水平与垂直排列方案;而QFormLayout则具备将输入控件与其标识信息有机结合在一起的能力;此外,QGridLayout则提供了网格化的数据组织排列方式;最后,QStackedLayout则能够呈现一组组件的不同展示状态并加以切换分布模式
继承关系如下

一,QBoxLayout:继承QLayout
QBoxLayout类通过垂直或水平的方式组织子组件。该布局类从其父布局或parentWidget()继承的空间资源中分割出列框,并为每个托管的小组件分配独立的框体区域以进行显示。
mainwindow.h 编程后的代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 声明按钮对象数组 */
QPushButton *pushButton[6];
/* 定义两个 widget,用于容纳排布按钮 */
QWidget *hWidget;
QWidget *vWidget;
/* QHBoxLayout 与 QVBoxLayout 对象 */
QHBoxLayout *hLayout;
QVBoxLayout *vLayout;
};
#endif
mainwindow.cpp 编程后的代码
#include "mainwindow.h"
#include <QList>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 设置主窗口的位置与大小 */
this->setGeometry(0, 0, 800, 480);
/* 实例化与设置位置大小 */
hWidget = new QWidget(this);
hWidget->setGeometry(0, 0, 800, 240);
vWidget = new QWidget(this);
vWidget->setGeometry(0, 240, 800, 240);
hLayout = new QHBoxLayout();
vLayout = new QVBoxLayout();
/*QList<T>是Qt的一种泛型容器类。它以链表方式存储一组值,并能对这组数据进行快速索引*/
QList <QString>list;
/* 将字符串值插入 list */
list<<"one"<<"two"<<"three"<<"four"<<"five"<<"six";
/* 用一个循环实例化 6 个按钮 */
for(int i = 0; i < 6; i++)
{
pushButton[i] = new QPushButton();
pushButton[i]->setText(list[i]);
if(i < 3)
{
/* 将按钮添加至 hLayout 中 */
hLayout->addWidget(pushButton[i]);
}
else
{
/* 将按钮添加至 vLayout 中 */
vLayout->addWidget(pushButton[i]);
}
}
/* 设置间隔为 50 */
hLayout->setSpacing(50);
/* hWidget 与 vWidget 的布局设置为 hLayout/vLayout */
hWidget->setLayout(hLayout);
vWidget->setLayout(vLayout);
}
MainWindow::~MainWindow()
{
}

二,QGridLayout:继承QLayout
通过获取父布局或parentWidget()的方法确定可用空间范围后,在水平方向上划分为多列,在垂直方向上划分成多行,并将这些小部件按行列分配到相应的单元格中。值得注意的是,在网格布局管理器中,默认情况下组件会根据窗口缩放而相应调整其位置与大小,并设定各组件之间的相对尺寸比例。与QBoxLayout不同的是网格布局管理器不仅需设定整体尺寸比例还要分别配置每一行与每一列的比例
- 声明:
QWidget *gWidget = nullptr; //声明并初始化为空指针的gWidget窗口组件
QGridLayout *gridLayout = nullptr; //声明并初始化为空指针的gridLayout对象
QPushButton *pushButtons[] = {nullptr, nullptr, nullptr, nullptr}; //创建一个包含四个QPushButton对象的数组
2,使用:
/* 设置位置与大小 */
this->setGeometry(0, 0, 800, 480);
/* 实例化 */
gWidget = new QWidget(this);
/* 设置 gWidget 居中央 */
this->setCentralWidget(gWidget);
gridLayout = new QGridLayout();
/* QList 链表,字符串类型 */
QList <QString> list;
list<<"按钮 1"<<"按钮 2"<<"按钮 3"<<"按钮 4";
for (int i = 0; i < 4; i++)
{
pushButton[i] = new QPushButton();
pushButton[i]->setText(list[i]);
/* 设置最小宽度与高度 */
pushButton[i]->setMinimumSize(100, 30);
/* 自动调整按钮的大小 */
pushButton[i]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
switch (i)
{
case 0:
/* 将 pushButton[0]添加至网格的坐标(0,0),下同 */
gridLayout->addWidget(pushButton[i], 0, 0);
break;
case 1:
gridLayout->addWidget(pushButton[i], 0, 1);
break;
case 2:
gridLayout->addWidget(pushButton[i], 1, 0);
break;
case 3:
gridLayout->addWidget(pushButton[i], 1, 1);
break;
default:
break;
}
}
/* 设置第 0 行与第 1 行的行比例系数 */
gridLayout->setRowStretch(0, 2);
gridLayout->setRowStretch(1, 3);
/* 设置第 0 列与第 1 列的列比例系数 */
gridLayout->setColumnStretch(0, 1);
gridLayout->setColumnStretch(1, 3);
/* 将 gridLayout 设置到 gWidget */
gWidget->setLayout(gridLayout);

三,QFormLayout:继承QLayout
负责管理各种输入组件及其相关标签的表单界面。该组件提供了一个便捷化的布局方案,并采用两列式排列方式来组织其子组件。左侧列为标签区域(如Product Name),右侧则包含一系列字段控件(如QLineEdit作为行编辑器、QSpinBox作为旋钮式输入组件)。在实际应用中,默认情况下会根据需求自动调节行高以确保良好的显示效果。
1,声明:
formWidget* formWidget; /* widget 实例 /
userNameInput userNameInput; /* 用户名字段 /
passwordInput passwordInput; /* 密码字段 /
layoutInstance formLayout = new QFormLayout(); /* 声明 QFormLayout 对象 */
int 2 = 0, useIt = 1;
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 设置位置与大小 */
this->setGeometry(0, 0, 800, 480);
/* 实例化及设置位置与大小,下同 */
fWidget = new QWidget(this);
fWidget->setGeometry(250, 100, 300, 200);
userLineEdit = new QLineEdit();
passwordLineEdit = new QLineEdit();
formLayout = new QFormLayout();
/* 添加行 */
formLayout->addRow("用户名:", userLineEdit);
formLayout->addRow("密码 :", passwordLineEdit);
/* 设置水平垂直间距 */
formLayout->setSpacing(10);
/* 设置布局外框的宽度 */
formLayout->setMargin(20);
/* 将 formLayout 布局到 fWidget */
fWidget->setLayout(formLayout);
}

第四章 空间间距: 继承QLayoutItem。水平间距用于布局设计时的横向分隔, 垂直间距则用于纵向分隔, 两者共同构成界面的空间布局机制
在布局中使用QSpacerItem类可获得空白间隔。因此,在布局中使用QSpacerItem类。它包含水平间距与垂直间距。
1,声明:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QSpacerItem>
#include <QBoxLayout>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 按钮对象数组 */
QPushButton *bt[4];
/* 垂直间隔 */
QSpacerItem *vSpacer;
/* 水平间隔 */
QSpacerItem *hSpacer;
/* 声明一个widget用来存放布局的内容 */
QWidget *widget;
/* 主布局对象 */
QHBoxLayout *mainLayout;
/* 垂直布局对象 */
QVBoxLayout *vBoxLayout;
/* 水平布局对象 */
QHBoxLayout *hBoxLayout;
};
#endif // MAINWINDOW_H
2,使用
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 设置主窗体显示位置与大小 */
this->setGeometry(0, 0, 800, 480);
widget = new QWidget(this);
/* 居中widget */
this->setCentralWidget(widget);
/* 实例化对象 */
vSpacer = new QSpacerItem(10, 10,
QSizePolicy::Minimum,
QSizePolicy::Expanding
);
hSpacer = new QSpacerItem(10, 10,
QSizePolicy::Expanding,
QSizePolicy::Minimum
);
vBoxLayout = new QVBoxLayout();
hBoxLayout = new QHBoxLayout();
mainLayout = new QHBoxLayout();
/* 在vBoxLayout添加垂直间隔 */
vBoxLayout->addSpacerItem(vSpacer);
QList <QString>list;
/* 将字符串值插入list */
list<<"按钮1"<<"按钮2"<<"按钮3"<<"按钮4";
/* 用一个循环实例化4个按钮 */
for(int i = 0; i < 4 ; i++)
{
bt[i] = new QPushButton();
bt[i]->setText(list[i]);
if (i == 0)
{
/* 按钮1,设置为100*100 */
bt[i]->setFixedSize(100, 100);
/* 在vBoxLayout添加按钮1 */
vBoxLayout->addWidget(bt[i]);
}
else
{
/* 按钮2~4,设置为60*60 */
bt[i]->setFixedSize(60, 60);
/* 在hBoxLayout添加按钮2~4 */
hBoxLayout->addWidget(bt[i]);
}
}
/* 在hBoxLayout添加水平间隔 */
hBoxLayout->addSpacerItem(hSpacer);
/* 在主布局里添加垂直布局 */
mainLayout->addLayout(vBoxLayout);
/* 在主布局里添加水平布局 */
mainLayout->addLayout(hBoxLayout);
/* 设置部件间距 */
mainLayout->setSpacing(50);
/* 将主布局设置为widget的布局 */
widget->setLayout(mainLayout);
}
MainWindow::~MainWindow()
{
}

