Qt开发之路17---布局管理器

一:简介

所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。
Qt 提供了两种组件定位机制:绝对定位和布局定位。

  • 绝对定位:就是一种最原始的定位方法:给出这个组件的坐标和长宽值。
    这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。或者,还有更简单的方法:禁止用户改变窗口大小。

  • 布局定位:只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。

以下三种是我们最常用的Qt 布局:
QHBoxLayout:按照水平方向从左到右布局;
QVBoxLayout:按照竖直方向从上到下布局;
QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;

二:实例

  • 1.绝对定位
    可以代码中设置位置,也可以UI中拖拽放位置,例程如下:
#include <QApplication>
#include <QWidget>
#include <QPushButton>

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


    QWidget *w = new QWidget();

    QPushButton *btn1 = new QPushButton(w);
    btn1->setText("one");
    btn1->setGeometry(10,10,50,30);

    QPushButton *btn2 = new QPushButton(w);
    btn2->setText("two");
    btn2->setGeometry(80,10,50,30);

    QPushButton *btn3 = new QPushButton(w);
    btn3->setText("three");
    btn3->setGeometry(150,10,50,30);

    QPushButton *btn4 = new QPushButton(w);
    btn4->setText("three");
    btn4->setGeometry(220,10,50,30);
    
    
    w->show();
    return a.exec();
}

在这里插入图片描述

  • 2.QHBoxLayout 水平布局
    从左往右布局成水平行,例程如下:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>

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


    QWidget *w = new QWidget();

    QPushButton *btn1 = new QPushButton();
    btn1->setText("one");

    QPushButton *btn2 = new QPushButton();
    btn2->setText("two");

    QPushButton *btn3 = new QPushButton();
    btn3->setText("three");

    QPushButton *btn4 = new QPushButton();
    btn4->setText("four");

    QHBoxLayout *layout = new QHBoxLayout();
    layout->addWidget(btn1);
    layout->addWidget(btn2);
    layout->addWidget(btn3);
    layout->addWidget(btn4);

    w->setLayout(layout);


    w->show();
    return a.exec();
}

在这里插入图片描述

  • 3.QVBoxLayout 垂直布局
    垂直布局,从顶部到底部,例程如下:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>

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


    QWidget *w = new QWidget();

    QPushButton *btn1 = new QPushButton();
    btn1->setText("one");

    QPushButton *btn2 = new QPushButton();
    btn2->setText("two");

    QPushButton *btn3 = new QPushButton();
    btn3->setText("three");

    QPushButton *btn4 = new QPushButton();
    btn4->setText("four");

    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(btn1);
    layout->addWidget(btn2);
    layout->addWidget(btn3);
    layout->addWidget(btn4);

    w->setLayout(layout);


    w->show();
    return a.exec();
}

在这里插入图片描述

  • 4.QGridLayout 网格布局
    网格布局。它可以容纳多个单元格
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QGridLayout>

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


    QWidget *w = new QWidget();

    QPushButton *btn1 = new QPushButton();
    btn1->setText("one");

    QPushButton *btn2 = new QPushButton();
    btn2->setText("two");

    QPushButton *btn3 = new QPushButton();
    btn3->setText("three");

    QPushButton *btn4 = new QPushButton();
    btn4->setText("four");

    QGridLayout *layout = new QGridLayout();
    layout->addWidget(btn1,0,0);
    layout->addWidget(btn2,0,1);
    layout->addWidget(btn3,1,0);
    layout->addWidget(btn4,1,1);

    w->setLayout(layout);


    w->show();
    return a.exec();
}

在这里插入图片描述

三:布局中控件的sizePolicy属性

控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局。控件的水平和垂直策略都可以设置。下面列举了一些最长用的值:

  1. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。
  2. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以
    放大。
  3. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小
    的允许尺寸。
  4. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小。
  5. Expandint:控件可以自行增大或者缩小

四:注意事项

  1. 当使用布局的时候,在创建子widget时,没必要给它传递父类。布局会自动重新定义它们的父类(通过QWidget::setParent())以确保它们是装载布局的widget的子类。
  2. 布局中的控件是装载布局控件的子控件,不是布局的子控件。控件只能以其他控件作为父类,不可以以布局作为父类。在布局上,可以使用addLayout来嵌套布局;被嵌套的布局,将变成上层布局的子布局。
  3. 通常,widgets创建的时候没有设置拉伸系数。当widget整理到一个布局中时,它们将根据QWidget::sizePolicy()或者最小大小hint(取决于谁更大)分配一定空间。拉伸系数被用于按比例改变widget的分配空间。

上一篇:Qt开发之路16—模块化设计.pri文件
下一篇:Qt开发之路18—消息机制和事件(深入分析)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值