Qt编程基础 | 第四章-布局管理器 | 4.1、布局管理器简介

【Qt常用控件】—— 布局管理器 布局管理器详解 阅读详情

一、什么是布局管理器?

1.1、布局管理器的作用

布局管理器是摆放控件的辅助工具,主要解决组件的位置和大小无法自适应父窗口变化的问题,主要功能如下:

  • 自动调整控件的位置,包括控件之间的间距、对齐等
  • 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观

借助布局管理器,无需再逐个调整控件的位置和大小,可以将更多的精力放在软件功能的实现上。

1.2、布局管理器类继承结构图

Qt 共提供了 5 种布局管理器,每种布局管理器对应一个类,分别是 QVBoxLayout(垂直布局)、QHBoxLayout(水平布局)、QGridLayout(网格布局)、QFormLayout(表单布局)和 QStackedLayout(分组布局),继承关系如下图:

在这里插入图片描述

二、布局管理器样式

2.1、QVBoxLayout(垂直布局)

将所有控件从上到下(或者从下到上)依次摆放,例如:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QVBoxLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建垂直布局管理器
	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);

	//设置控件外边距
	layout->setMargin(30);
	//添加控件,控件的伸缩系数比是 1:1:1
	layout->addWidget(&lab1, 1);
	//设置控件间距(当前例子是不同label之间的间距,大小是固定的)
	layout->addSpacing(20);
	layout->addWidget(&lab2, 1);
	layout->addSpacing(20);
	layout->addWidget(&lab3, 1);

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

2.2、QHBoxLayout(水平布局)

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

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QHBoxLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建水平布局管理器
	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);

	//组件的伸缩系数比是 1:1:1
	layout->addWidget(&lab3, 1);
	layout->addWidget(&lab2, 1);
	layout->addWidget(&lab1, 1);

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

2.3、QGridLayout(网格布局)

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

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QGridLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建网格布局管理器
	QGridLayout *layout = new QGridLayout;

	//连续创建 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);
	QLabel lab4("Label4");
	lab4.setStyleSheet("QLabel{background:#aaaaaa;font:20px;}");
	lab4.setAlignment(Qt::AlignCenter);
	QLabel lab5("Label5");
	lab5.setStyleSheet("QLabel{background:#bbbbbb;font:20px;}");
	lab5.setAlignment(Qt::AlignCenter);

	//组件添加到网格布局管理器
	layout->addWidget(&lab1, 0, 0);
	layout->addWidget(&lab2, 0, 1);
	layout->addWidget(&lab3, 1, 0, 1, 2);
	layout->addWidget(&lab4, 2, 0);
	layout->addWidget(&lab5, 2, 1);

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

2.4、QFormLayout(表单布局)

Qt 提供了很多种输入框控件,包括 QLineEdit 单行输入框、QTextEdit 多行输入框等。通常情况下,每个输入框的旁边都会附带一些文字(又称标签),用来提示用户需要输入的信息。QFormLayout 可以容纳很多个输入框以及对应的标签,并将它们从上到下依次排列在界面上,如下:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口大小
	widget.resize(500, 250);
	//设置窗口标题
	widget.setWindowTitle("QFormLayout");

	//创建表单布局管理器
	QFormLayout* layout = new QFormLayout();
	//设置表单中的标签都位于控件的上方
	layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
	//添加 3 行输入框和标签
	layout->addRow("Name:", new QLineEdit());
	layout->addRow("Email:", new QLineEdit());
	layout->addRow("Adress:", new QLineEdit());
	//设置行间距和列间距为 10
	layout->setSpacing(10);
	//将 layout 表单添加到 widget 窗口中
	widget.setLayout(layout);
	widget.show();
	return a.exec();
}

2.5、QStackedLayout(分组布局管理器)

QStackedLayout布局管理器可以容纳多个控件或者窗口,但每次只显示其中的一个,如下:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QStackedLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建一个列表
	QListWidget *listWidget = new QListWidget(&widget);
	listWidget->setMinimumWidth(150);
	listWidget->setFont(QFont("宋体", 14));
	listWidget->addItem("QPushButton");
	listWidget->addItem("QLabel");
	listWidget->addItem("QLineEdit");

	//新建 3 个窗口,分别放置文本框、按钮和单行输入框
	QWidget widget1;
	widget1.setMinimumSize(200, 200);
	QPushButton but1("PushButton", &widget1);

	QWidget widget2;
	widget2.setMinimumSize(200, 200);
	QLabel lab1("This is a Label", &widget2);

	QWidget widget3;
	widget3.setMinimumSize(200, 200);
	QLineEdit edit("This is a QLineEdit", &widget3);

	//创建一个分组布局,将 3 个窗口添加到分组控件中
	QStackedLayout *stackedLayout = new QStackedLayout;
	stackedLayout->addWidget(&widget1);
	stackedLayout->addWidget(&widget2);
	stackedLayout->addWidget(&widget3);

	//向主窗口中添加一个水平布局控件
	QHBoxLayout *layout = new QHBoxLayout;
	layout->addWidget(listWidget, 1);
	layout->addLayout(stackedLayout, 4);

	//将 layout 水平布局控件添加到 widget 窗口中
	widget.setLayout(layout);
	widget.show();

	//连接信号和槽,实现当点击列表中的某一项,切换分组布局管理器显示的控件
	QObject::connect(listWidget, &QListWidget::currentRowChanged, stackedLayout, &QStackedLayout::setCurrentIndex);
	return a.exec();
}

三、布局管理器常用操作

3.1、QBoxLayout(垂直与水平布局)

垂直布局管理器常用操作,如下:

// 1、添加控件
void addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())

// 2、添加子布局
void addLayout(QLayout *layout, int stretch = 0)

// 3、设置边界
void setContentsMargins(int left, int top, int right, int bottom)
void setMargin(int margin)

// 4、设置间距
void addSpacing(int size)    // 设置固定间隔
void addStretch(int stretch = 0)    // 设置可伸缩间距,stretch是伸缩因子

// 5、设置布局方向
void setDirection(Direction direction)

// 6、设置拉伸系数
void setStretch(int index, int stretch)
bool setStretchFactor(QWidget *widget, int stretch)
bool setStretchFactor(QLayout *layout, int stretch)

// 7、设置布局策略
void setSizeConstraint(SizeConstraint)

3.2、QGridLayout(网格布局)

网格布局管理器常用操作,如下:

// 1、添加控件
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, 
	Qt::Alignment alignment = Qt::Alignment())

// 2、添加子布局
void addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, 
	Qt::Alignment alignment = Qt::Alignment())

// 3、设置拉伸系数
void setColumnStretch(int column, int stretch)    // 给指定列设置拉伸系数
void setRowStretch(int row, int stretch)    // 给指定行设置拉伸系数

3.3、QFormLayout(表单布局)

表单布局管理器常用操作,如下:

// 1、添加控件
// 将指定的field控件和存储标签的label控件添加到表单控件中的末尾
void addRow(QWidget *label, QWidget *field)    
 // 将指定的 field 控件和 labelText 标签添加到表单控件的末尾
void addRow(const QString &labelText, QWidget *field)   

// 2、设置标签显示格式,默认标签位于控件的左侧
void setRowWrapPolicy(RowWrapPolicy policy)

3.4、QStackedLayout(分组布局管理器)

分组布局管理器常用操作,如下:

// 1、添加控件
int addWidget(QWidget *widget)

// 2、设置显示样式
void setStackingMode(StackingMode stackingMode)
QT概念详解及开发入门简介 QT概念详解及开发入门简介 文章目录QT概念详解及开发入门简介QT概念QT如何开发如何编译重要知识点1)布局管理器2)信号与槽 QT概念 Qt是一种基于C++的跨平台图形用户界面应用程序开发框架。如何跨平台?上到服务器上位机,下到嵌入式GUI,上天入地,无所不能。2014年,跨平台集成开发环境Qt Crator 3.1.0正式发布出来,至此,全面支持IOS、Android、WP、QT的时代开始逐步展开。而对于嵌入式开发的我们所使用的Qt,是Qt的Embedded Linux分支平台,在原始Qt的基础上,做 阅读详情

相关推荐

零基础学Qt 4编程之中心窗口部件的使用总结

Qt程序中的主窗口通常具有一个中心窗口部件。从理论上来讲,任何继承自QWidget的类的派生类的实例,都可以作为中心窗口部件使用。 几种常见情形 QMainWindow的中心区域可以被任意种类的窗口部件所占用。下面给出的是可能的情形。 ⒈ 使用标准的Qt窗口部件(Standard Widget) 像QWidget、Qlabel以及QTextEdit等等这样的标准窗口部件

qter_wd007的专栏 1万+

QT---布局管理器(全)

无

shengruidv的博客 1118

Qt - 布局管理器

实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。总之借助布局管理器,我们无需再逐个调整控件的位置和大小,可以将更多的精力放在软件功能的实现上。

QtCompany的博客 683

【Qt】控件概述(7)—— 布局管理器

QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout

qq_74276498的博客 1672

QT基础教程(布局管理器)

本篇文章我们开始来讲解布局管理器的使用,在界面布局时布局管理器可以说是非常重要的一个存在,有了布局管理器我们就可以让我们的界面变的更加好看。布局管理器(Layout Manager)是一种在图形用户界面(GUI)应用程序中用于自动管理和排列窗口部件(Widget)的工具。布局管理器使得窗口部件能够自适应不同的窗口大小或用户界面布局,从而更好地适应不同的屏幕尺寸和用户需求。在Qt中,提供了多种布局管理器来帮助开发者方便地组织和管理窗口部件。

m0_49476241的博客 1289

【JAVA】-- Java五大常用布局管理器(BorderLayout、FlowLayout、GridLayout、GridBagLayout、CardLayout)

在Swing组件中,有JFrame和JDialog这样的顶级容器(也叫窗口),顶级容器不能放置在其他容器中,可完成窗口大小化等基本功能。也有JPanel这样的面板组件,比较复杂的布局,需要布局管理器的组合使用,面板组件可以将多个布局管理器结合使用,组件在容器中的位置和尺寸由布局管理器决定。下面将要说的布局管理器就是具体的布局,一个界面只能有一个顶级容器,可以有多个面板组件,面板组件上可以使用多个布局管理器。Swing提供了八种布局管理器:BorderLayout(边界布局管理器)、BoxLayout(箱式布

个人博客 6773

QT GUI编程

QT 程序设计!一、QT基础Qt简介Qt应用范围开发环境Qt Creator安装Qt内存管理第一个Qt程序打印跟踪信号与槽二、窗口部件三、主窗口四、QT基础五、QT基础六、QT基础七、QT基础持 续 更 新 中 . . . . . . 一、QT基础 Qt简介 Qt应用范围 开发环境 Qt Creator安装 Qt内存管理 第一个Qt程序 打印跟踪 信号与槽 二、窗口部件 三、主窗口 四、QT基础 五、QT基础 六、QT基础 七、QT基础 持 续 更 新 中 . . . . . . ...

子羽丿_的博客 12万+

QT——开发入门简介

1、你了解Qt吗? Qt是一种基于C++的跨平台图形用户界面应用程序开发框架。如何跨平台?上到服务器上位机,下到嵌入式GUI,上天入地无所不能。Qt最早是由1991年由Qt Company开发,但是到2008年,Qt Company科技被诺基亚公司收购,是的,就是拥有着我们很多情怀的诺基亚。但在2012年,Qt又被Digia收购。等到了2014年,跨平台集成开发环境Qt Creator 3.1....

数字世界 万物互联 10万+

【C++】QT学习的小练习编程

QT学习过程中的知识点练习代码,本篇代码占大部分

修成真的博客 2343

深入C++ GUI Qt4 编程(第二版)教程与实践

本文还有配套的精品资源,点击获取 简介:《C++ GUI Qt4 编程(第二版)》全面介绍了如何利用Qt4框架进行高效的图形用户界面开发。书中详细介绍了Qt4的基本概念、架构和类库,以及如何通过Qt Designer进行界面设计和与C++代码交互。特别强调了Qt的信号和槽机制,模型视图架构,以及网络编程。本书还涵盖了GUI控件和小部件的使用,以及如何集成数据库和处理国际化问...

weixin_36123300的博客 1228

C++ GUI编程实战:Qt4框架源码详解

Qt4采用模块化设计理念,核心模块包括QtCoreQtGuiQtNetwork等,各司其职又紧密协作。其中,QtCore提供非GUI基础功能,如元对象系统、信号与槽、事件循环;QtGui封装图形界面组件与绘图能力。这种分层结构提升了代码可维护性与复用性。除了系统生成的标准事件外,Qt还允许用户通过QEvent派生类定义自己的事件类型,并利用或主动将其插入事件队列。这种方式常用于跨线程通信或延迟执行任务。public:// 发送事件在此示例中,

weixin_42591908的博客 1109

Qt布局管理器

1.存在的问题 目前的GUI开发方式:绝对定位 直接在像素级指定各个组件的位置和大小 void QWidget::move(int x, int y) void QWidget::resize(int w, int h); 问题:组件的位置和大小无法自适应父窗口的变化 2.解决方案:布局管理器 提供相关的类对界面组件进行布局管理 能够自动排列窗口中的界面组件 窗口变化后自动更新界面组件的大小 QLayout是Qt中布局管理器的抽象基类 通过继承QLayout实现了功能各异且互补的布局管理器 Qt中可以根据需

weixin_46571142的博客 1126

精通QT4编程:源代码详解与实践

QT4是一个广泛使用的跨平台C++应用程序框架,它提供了一套统一的应用程序接口(API),让开发者能够专注于业务逻辑的实现,而无需为不同的操作系统编写特定的代码。QT4支持包括Windows、Linux和Mac OS X在内的多个操作系统。当内置图形项不能满足特定需求时,自定义图形项成为了必然选择。通过重写自定义图形项的绘制函数,我们可以绘制出任何形状和样式。同时,通过重写事件处理函数,我们可以为图形项添加复杂的交互行为。

weixin_33173126的博客 516

QT:布局管理器

布局管理器

海绵宝宝de派小星的博客 6709

C++ GUI Qt4 编程指南及实践教程

C++是一种支持多范式编程的静态类型、编译式语言,广泛用于系统软件、游戏开发、嵌入式开发等领域。其主要特性包括:面向对象编程(OOP): C++支持封装、继承和多态,允许开发者定义类和对象,构建可重用和可维护的代码库。泛型编程: 借助模板,C++能够实现算法和容器的泛型化,提高代码的灵活性和效率。性能: C++提供接近硬件级别的性能,特别是在资源受限的环境下,C++的优势尤为明显。内存管理。

weixin_31720909的博客 728

写出GD32L233/235在读写flash的区别(用于OTA功能)

在单片机里面表示 大概是 address += sizeof(uint32_t) address += sizeof(uint64_t)1.说到OTA功能,实际上 往flash 指定区域写 数据, 拷贝数据,然后 跳转, 必要时 注意单片机的偏移量。在写本文时,L233支持单字写入,而L235只有双字写入. 一个写入地址+4 一个写入地址+8。这个是 自己写的擦除一页 数据,当然可以参考 提供的demo去实现,看自己需求。接下来是 读取 双字,也就是在L235上的读取。

teleger的博客 908

【QT教程】QT6基础教程

QT6的发展历程《QT6基础教程》正文,QT6发展历程QT是挪威Trolltech公司(后被Nokia收购,之后又转手给Digia,最终由The Qt Company继续开发)开发的一个跨平台的C++图形用户界面应用程序框架。它被广泛用于开发GUI应用程序,也可以用于开发非GUI程序,如控制台工具和服务器。QT支持应用程序的跨平台开发和部署,这意味着用QT开发的程序可以在多种操作系统上运行,包括Windows、Mac OS、Linux、iOS和Android等。

QT性能优化QT原理源码QT界面美化 2716

WinInet 编程:MFC 中的互联网编程

WinInet 是一套 Windows API(应用程序编程接口),用于实现互联网应用程序的网络通信和数据传输。WinInet 抽象了底层网络协议和硬件细节,为程序员提供了一套统一的接口,简化了互联网应用程序的开发过程。WinInet 广泛应用于各种 Windows 应用程序中,包括网页浏览器、下载管理器、网络游戏等。MFC WinInet 是一套强大的类库,为 MFC 程序员提供了在 Windows 平台上实现互联网通信和数据传输的工具。

JAZJD的博客 1638

QT Widgets界面编程实战

QT_Widgets简介QT Widgets简介QT Widgets是QT框架中用于构建图形用户界面(GUI)的一部分。它是一组UI元素和布局管理器的集合,可以用来创建复杂的应用程序界面。QT Widgets是QT库中非常核心的一个模块,它为开发者提供了丰富的控件(Widgets),如按钮、文本框、标签、菜单等,以及布局管理器,如垂直布局、水平布局、网格布局等,使得开发者可以方便、快速地创建出符合需求的用户界面。QT Widgets的主要特点QT Widgets的主要特点如下,

QT性能优化QT原理源码QT界面美化 997

开源多波束声呐数据集:从原始回波到AI识别的关键一步

本文探讨了开源多波束前视声呐数据集(UATD)在AI目标识别中的关键作用。通过分析原始回波数据与处理后数据的差异,揭示了开源数据集如何降低研究成本、提升实验可重复性,并加速技术迭代。文章还详细解析了UATD数据集的结构、实战应用技巧及从原始数据到AI模型的完整流程,为水下目标识别研究提供了宝贵参考。

weixin_28675839的博客 422

50、压电微泵与技术设备驱动的研究分析

本文研究了压电微泵在弹性微通道中的流体流动特性及技术设备驱动的振动行为。通过建立轴对称流固耦合模型,利用FreeFem++进行数值模拟,分析了不同数量压电致动器和频率对微泵流量的影响,发现多个致动器按特定时序压缩可产生净正向流量,并提出了稳态流量的近似解析公式。同时,针对技术设备驱动系统,探讨了周期性负载引起的强迫振动特性,明确了共振条件及影响因素,并比较了主动、被动和优化设计等振动控制策略。最后展望了实验验证、多物理场耦合与智能控制等未来研究方向,为相关设备的优化设计与高效运行提供了理论支持。

convnet3designer的博客 148

【Qt开发】布局管理器(四)-> QFormLayout 表单布局

本文介绍了Qt框架中的QFormLayout布局管理器,专门用于创建表单样式的用户界面。QFormLayout通过标签-字段对的结构化排列,简化了数据输入界面的开发流程。文章分析了其设计理念、布局结构、对齐方式和间距控制,并提供了代码示例展示如何使用QFormLayout创建基本表单。该布局适用于设置对话框、数据录入等场景,具有开发效率高、维护简单、跨平台一致等优势,但在处理复杂非标准布局时可能存在局限。QFormLayout为大多数表单需求提供了高效专业的解决方案。

枫叶丹4的博客 1095

ZeroClaw安装、使用方法详细全解

ZeroClaw 是一个用 Rust 编写的轻量级、高性能、完全自主的 AI 助手运行时框架

洛星核的博客 618
上一篇: Qt编程基础 | 第四章-布局管理器 | 4.2、DPI对布局的影响
下一篇: Qt编程基础 | 第三章-控件 | 3.1、组合框
一个不务正业的程序猿
博客等级 码龄11年 1879粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值