一.Qt 布局

本文详细介绍了Qt中的三种常见布局管理器:QGridLayout、HBoxLayout和VBoxLayout,包括它们的用法、API设置以及如何设置间距和比例系数。通过实例演示了如何使用这些布局管理器来组织窗口中的组件。
摘要由CSDN通过智能技术生成

原文链接:

【QT】——布局_qt界面布局-CSDN博客

Qt学习之路14--布局管理器(QGridLayout)_qtwidgets.qgridlayout()setspacing(0)-CSDN博客

1.Qt布局介绍

Qt 窗口布局是指将多个子窗口按照某种排列方式将其全部展示到对应的父窗口中的一种处理方式。在 Qt 中常用的布局样式有三种,分别是:

  • 水平布局:布局中的所有的控件水平排列

  • 垂直布局:布局中的所有的控件垂直排列

  • 栅格布局:布局中的所有的控件垂直 + 水平排列

2. UI窗口布局

3. API设置布局

3.1 QLayout
// 在布局最后面添加一个窗口
void QLayout::addWidget(QWidget *w);
// 将某个窗口对象从布局中移除, 窗口对象如果不再使用需要自己析构
void QLayout::removeWidget(QWidget *widget);
// 设置布局的四个边界大小, 即: 左、上、右和下的边距。
void QLayout::setContentsMargins(int left, int top, int right, int bottom);
// 设置布局中各个窗口之间的间隙大小
void setSpacing(int);
3.2 QHBoxLayout
   
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //在QMaindow布局
    ui->setupUi(this);
    QWidget* w=new QWidget;
    setCentralWidget(w); //设置中心窗口,通常一个程序只有一个中心窗口
 
    QHBoxLayout* hlayout=new QHBoxLayout;
    QPushButton* b1=new QPushButton("1");
    QPushButton* b2=new QPushButton("2");
    QPushButton* b3=new QPushButton("3");
 
    hlayout->addWidget(b1);
    hlayout->addWidget(b2);
    hlayout->addWidget(b3);
 
    centralWidget()->setLayout(hlayout);
}

3.2 QVBoxLayout
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QWidget* w=new QWidget;
    setCentralWidget(w);
 
    QVBoxLayout* hlayout=new QVBoxLayout;
    QPushButton* b1=new QPushButton("1");
    QPushButton* b2=new QPushButton("2");
    QPushButton* b3=new QPushButton("3");
 
    hlayout->addWidget(b1);
    hlayout->addWidget(b2);
    hlayout->addWidget(b3);
 
    centralWidget()->setLayout(hlayout);
}

3.3 QGridLayout

由于网格布局管理器中的组件也是会随着窗口拉伸而发生变化的,所以也是需要设置组件之间的比例系数的,与QBoxLayout不同的是,网格布局管理器需要分别设置行和列的比例系数

layout->setRowStretch(int row, int stretch);//设置行比例系数
layout->setColumnStretch(int column, int stretch);//设置列比例系数
3.3.1 QGridLayout使用 ,通过四个按钮体验一下使用QGridLayout。
QGridLayout* layout = new QGridLayout();
​
TestBtn1.setText("Test Button 1");
TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);//设置组件大小可扩展
TestBtn1.setMinimumSize(160, 30);//设置最小尺寸
​
TestBtn2.setText("Test Button 2");
TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn2.setMinimumSize(160, 30);
​
TestBtn3.setText("Test Button 3");
TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn3.setMinimumSize(160, 30);
​
TestBtn4.setText("Test Button 4");
TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn4.setMinimumSize(160, 30);
​
layout->setSpacing(10);//设置间距
layout->addWidget(&TestBtn1, 0, 0);//往网格的不同坐标添加不同的组件
layout->addWidget(&TestBtn2, 0, 1);
layout->addWidget(&TestBtn3, 1, 0);
layout->addWidget(&TestBtn4, 1, 1);
​
layout->setRowStretch(0, 1);//设置行列比例系数
layout->setRowStretch(1, 3);
layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 3);
​
setLayout(layout);//设置顶级布局管理器

3.3 .2 addwidget 重载

3.3.3 嵌套

使用嵌套布局管理器的套路和之前的QBoxLayout是一样的,只是顶级布局管理器不光是管理组件,还要管理别的布局管理器。

QGridLayout* layout = new QGridLayout();
QVBoxLayout* vlayout = new QVBoxLayout();
​
/*中间省略不是太关键的五个按钮属性设置相关代码*/
​
layout->setSpacing(10);//设置按钮之间的距离
​
//将编号为123的按钮加到网格布局管理器
layout->addWidget(&TestBtn1, 0, 0);
layout->addWidget(&TestBtn2, 0, 1);
layout->addWidget(&TestBtn3, 1, 0);
​
//将编号为45的按钮加到垂直布局管理器
vlayout->addWidget(&TestBtn4);
vlayout->addWidget(&TestBtn5);
​
//布局管理器嵌套
layout->addLayout(vlayout,1, 1);
​
setLayout(layout);

3.3.4 QGridLayouut 总结
  • QGridLayout以网格的形式对组件进行定位

  • QGridLayout中的组件可以根据需要设置跨越多个网格

  • QGridLayout支持比例系数的概念,比例系数决定了组件的相对大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值