Qt常用布局

一、介绍

        布局管理器的作用是自动管理控件的位置和大小,确保它们在窗口调整大小时能够自动适应。通过使用布局管理器,可以实现界面的灵活布局和自适应性,而无需手动计算和设置控件的位置和大小。

        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,并创建了两个子部件pWidget1pWidget2。使用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()函数将在布局中添加一个伸缩项,使得someWidget1someWidget2之间的空间能够弹性调整,以适应布局的变化。

注意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);// 设置为当前窗口部件的布局

  • 17
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt Quick核心编程》起始于基础的开发环境搭建和Qt Creator快速介绍,帮助读者正确使用开发环境;着力于QML语言基础、事件、Qt Quick基本元素,辅以简要的ECMAScript(JavaScript)语言介绍,使得读者能够快速熟悉Qt Quick的基本知识和开发过程;对于Qt Quick中的关键主题,如动画、Model-View、Component、网络、多媒体,做了详尽入微的讲解,让读者一册在手,别无他求;QML与C++混合编程、Canvas、定制及自定义控件等高级主题,《Qt Quick核心编程》也做了详细讲解,同时提供了多个精彩的实作实例,力求概念清晰,用途明确。《Qt Quick核心编程》的内容适用于桌面与Android平台。值得一提的是,《Qt Quick核心编程》覆盖了Android开发的多个主题,如拍照、定位、录音、国际化、可伸缩界面等,也是使用Qt Quick进行移动开发不可错过的。 《Qt Quick核心编程》的读者对象为:希望学习一门高效的界面编程语言开发人员;希望在多个移动设备(如智能手机)上构建流畅用户界面开发人员;有一定C/C++基础,希望快速构建应用程序界面的开发人员;有一定Qt基础,希望快速构建界面的开发人员;有一定QML基础,想进阶学习的朋友;想熟悉跨平台应用开发框架的开发人员。 目录 第1章 Qt Quick概览 第2章 Qt开发环境快速上手 第3章 QML语言基础 第4章 Qt Quick入门 第5章 ECMAScript初探 第6章 Qt Quick事件处理 第7章 组件与动态对象 第8章 Qt Quick元素布局 第9章 Qt Quick常用元素介绍 第10章 Canvas(画布) 第11章 C++与QML混合编程 第12章 动画 第13章 Model/View 第14章 多媒体 第15章 网络 第16章 定位 第17章 综合实例之文件查看器 第18章 综合实例之聊哈

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值