【C++QT】Layout 布局管理控件详解

文章目录

  • [一、QVBoxLayout 垂直布局](#一、QVBoxLayout 垂直布局)
    • [1.1 特点](#1.1 特点)
    • [1.2 常用方法](#1.2 常用方法)
    • [1.3 应用场景](#1.3 应用场景)
    • [1.4 示例代码](#1.4 示例代码)
  • [二、QHBoxLayout 水平布局](#二、QHBoxLayout 水平布局)
    • [2.1 特点](#2.1 特点)
    • [2.2 常用方法](#2.2 常用方法)
    • [2.3 应用场景](#2.3 应用场景)
    • [2.4 示例代码](#2.4 示例代码)
  • [三、QGridLayout 网格布局](#三、QGridLayout 网格布局)
    • [3.1 特点](#3.1 特点)
    • [3.2 常用方法](#3.2 常用方法)
    • [3.3 应用场景](#3.3 应用场景)
    • [3.4 示例代码](#3.4 示例代码)
  • [四、QFormLayout 表单布局](#四、QFormLayout 表单布局)
    • [4.1 特点](#4.1 特点)
    • [4.2 常用方法](#4.2 常用方法)
    • [4.3 应用场景](#4.3 应用场景)
    • [4.4 示例代码](#4.4 示例代码)
  • 五、总结

在 C++ Qt 中,布局管理器(Layout)是用于自动管理窗口中控件的大小和位置的重要工具。Layout 组中常见的布局类型有 QVBoxLayout(垂直布局)、QHBoxLayout(水平布局)、QGridLayout(网格布局)和 QFormLayout(表单布局)。本文将详细解析这些布局管理器的使用方法和应用场景。


一、QVBoxLayout 垂直布局

1.1 特点

  • 按照垂直方向,从上到下依次排列添加的控件。
  • 会根据控件的大小策略和布局的设置自动调整每个控件的大小和位置。
  • 可以添加间距和伸缩因子,用于控制控件之间的间距和空间分配。

1.2 常用方法

  • addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment()):添加一个控件到布局中,stretch 为伸缩因子,alignment 为对齐方式。
  • addSpacing(int size):添加一个固定大小的间距。
  • addStretch(int stretch = 0):添加一个可伸缩的空间,stretch 为伸缩因子。

1.3 应用场景

常用于菜单、按钮列表、堆叠式的界面元素等。

1.4 示例代码

cpp 复制代码
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout;

    QLabel *titleLabel = new QLabel("Title");
    titleLabel->setAlignment(Qt::AlignCenter);
    layout->addWidget(titleLabel);

    layout->addStretch(1);

    QPushButton *button1 = new QPushButton("Button 1");
    QPushButton *button2 = new QPushButton("Button 2");
    QPushButton *button3 = new QPushButton("Button 3");

    layout->addWidget(button1);
    layout->addWidget(button2);
    layout->addWidget(button3);

    layout->addStretch(2);

    window.setLayout(layout);
    window.show();

    return a.exec();
}

上述示例中,标题标签位于顶部,三个按钮位于中间,顶部和底部都有伸缩空间,底部的伸缩空间是顶部的两倍。


二、QHBoxLayout 水平布局

2.1 特点

  • 按照水平方向,从左到右依次排列添加的控件。
  • 同样会根据控件的大小策略和布局的设置自动调整每个控件的大小和位置。
  • 也可以添加间距和伸缩因子。

2.2 常用方法

  • addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment()):添加一个控件到布局中。
  • addSpacing(int size):添加一个固定大小的间距。
  • addStretch(int stretch = 0):添加一个可伸缩的空间。

2.3 应用场景

常用于工具栏、导航栏、并排显示的控件等。

2.4 示例代码

cpp 复制代码
#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget window;
    QHBoxLayout *layout = new QHBoxLayout;

    QPushButton *backButton = new QPushButton("Back");
    QLabel *titleLabel = new QLabel("Page Title");
    titleLabel->setAlignment(Qt::AlignCenter);
    QPushButton *forwardButton = new QPushButton("Forward");

    layout->addWidget(backButton);
    layout->addStretch(1);
    layout->addWidget(titleLabel);
    layout->addStretch(1);
    layout->addWidget(forwardButton);

    window.setLayout(layout);
    window.show();

    return a.exec();
}

上述示例中,"Back" 按钮在左边,"Forward" 按钮在右边,标题标签在中间,两边都有伸缩空间。


三、QGridLayout 网格布局

3.1 特点

  • 将控件放置在一个二维网格中,可以精确控制每个控件的行和列位置。
  • 可以设置控件跨越多个行或列。
  • 会自动调整网格的大小以适应控件。

3.2 常用方法

  • addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment()):将控件添加到指定的行和列。
  • addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment()):将控件添加到指定的行和列,并指定跨越的行数和列数。
  • setRowStretch(int row, int stretch):设置某一行的伸缩因子。
  • setColumnStretch(int column, int stretch):设置某一列的伸缩因子。

3.3 应用场景

常用于表格、矩阵、棋盘等需要二维布局的场景。

3.4 示例代码

cpp 复制代码
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget window;
    QGridLayout *layout = new QGridLayout;

    QPushButton *button1 = new QPushButton("1");
    QPushButton *button2 = new QPushButton("2");
    QPushButton *button3 = new QPushButton("3");
    QPushButton *button4 = new QPushButton("4");
    QPushButton *button5 = new QPushButton("5");
    QPushButton *button6 = new QPushButton("6");

    layout->addWidget(button1, 0, 0);
    layout->addWidget(button2, 0, 1);
    layout->addWidget(button3, 0, 2);
    layout->addWidget(button4, 1, 0);
    layout->addWidget(button5, 1, 1, 1, 2); // 跨越两列

    window.setLayout(layout);
    window.show();

    return a.exec();
}

上述示例中,创建了一个简单的 2x3 网格布局,其中按钮 5 跨越了两列。


四、QFormLayout 表单布局

4.1 特点

  • 专门用于创建表单,将控件以标签 - 字段的形式排列。
  • 可以方便地添加行,每行包含一个标签和一个对应的输入控件。
  • 会自动调整标签和控件的对齐方式。

4.2 常用方法

  • addRow(const QString &labelText, QWidget *field):添加一行,包含一个标签和一个控件。
  • addRow(QWidget *label, QWidget *field):添加一行,标签和控件都是 QWidget 类型。
  • setRowWrapPolicy(RowWrapPolicy policy):设置行的换行策略。

4.3 应用场景

常用于用户输入表单,如登录表单、注册表单等。

4.4 示例代码

cpp 复制代码
#include <QApplication>
#include <QWidget>
#include <QFormLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QCheckBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget window;
    QFormLayout *layout = new QFormLayout;

    QLineEdit *nameEdit = new QLineEdit;
    QLineEdit *emailEdit = new QLineEdit;
    QCheckBox *subscribeCheckBox = new QCheckBox("Subscribe to newsletter");
    QPushButton *submitButton = new QPushButton("Submit");

    layout->addRow("Name:", nameEdit);
    layout->addRow("Email:", emailEdit);
    layout->addRow(subscribeCheckBox);
    layout->addRow(submitButton);

    window.setLayout(layout);
    window.show();

    return a.exec();
}

上述示例中,创建了一个简单的表单,包含姓名、邮箱输入框,一个复选框和一个提交按钮。


五、总结

5.1 各布局管理器特点

  • 垂直布局(QVBoxLayout:按照垂直方向,自上而下排列控件。可添加间距与伸缩因子,适用于菜单、按钮列表这类需垂直排列元素的场景。
  • 水平布局(QHBoxLayout:按水平方向,从左到右排列控件。同样支持添加间距和伸缩因子,常用于工具栏、导航栏等需水平排列控件的场景。
  • 网格布局(QGridLayout:将控件置于二维网格中,可精确控制行和列位置,还能设置控件跨越行或列。适合表格、矩阵等需要二维布局的场景。
  • 表单布局(QFormLayout:专门用于创建表单,以标签 - 字段形式排列控件,能自动调整对齐方式,适用于登录表单、注册表单等用户输入表单。

5.2 常用方法总结

  • 添加控件 :四种布局管理器都有添加控件的方法,如 addWidget ,可指定控件、伸缩因子和对齐方式。QGridLayout 还能指定行、列及跨越的行和列数;QFormLayout 则可按标签 - 字段的形式添加行。
  • 添加间距和伸缩空间QVBoxLayoutQHBoxLayout 可使用 addSpacing 添加固定间距,用 addStretch 添加可伸缩空间。
  • 设置伸缩因子QGridLayout 可通过 setRowStretchsetColumnStretch 分别设置行和列的伸缩因子。
  • 设置换行策略QFormLayout 能使用 setRowWrapPolicy 设置行的换行策略。

这些布局管理器不仅各自具备独特的布局功能,还能相互嵌套,从而实现更复杂、多样化的界面布局,满足各种不同的设计需求。开发者可根据具体的界面设计要求,灵活选择合适的布局管理器及其组合方式。


如果这篇文章对你有所帮助,渴望获得你的一个点赞!

相关推荐
jerry60929 分钟前
c++流对象
开发语言·c++·算法
虾球xz34 分钟前
游戏引擎学习第247天:简化DEBUG_VALUE
c++·学习·游戏引擎
樂5021 小时前
关于 Web 服务器的五个案例
linux·服务器·经验分享
vim怎么退出1 小时前
43.验证二叉搜索树
前端·leetcode
superior tigre2 小时前
C++学习:六个月从基础到就业——模板编程:模板特化
开发语言·c++·学习
码农新猿类2 小时前
信号量函数
linux·c++·visual studio
·醉挽清风·2 小时前
学习笔记—双指针算法—移动零
c++·笔记·学习·算法
编程绿豆侠2 小时前
力扣HOT100之链表:23. 合并 K 个升序链表
算法·leetcode·链表
Ayanami_Reii2 小时前
Leetcode837.新21点
c++·笔记·算法
simple_whu3 小时前
Visual Studio C/C++编译器cl.exe的/source-charset与/execution-charset设置项
c语言·c++·visual studio