第22课 布局管理器(一)

1、目前的GUI开发方式:绝对定位

    1.1、 直接在 像素级 指定各个组件的位置和大小
        1.1.1、 void Qwidget::move(int x, int y)
        1.1.2、 void Qwidget::resize(int x, int y)
    1.2、 问题:组件的大小和位置 无法自适应父窗口的变化

2、布局管理器

    2.1、 Qt提供相关的类 对界面组件进行布局管理
        2.1.1、 能够 自动排列 窗口中的界面组件
        2.1.2、 窗口变化后 自动更新界面组件的大小

    2.2、 QLayout类
        2.2.1、 QLayout是Qt中布局管理器的 抽象基类
        2.2.2、 通过 继承QLayout 实现了 功能各异且互补 的布局管理器
        2.2.3、 Qt中可以根据需要 自定义布局管理器(一般不要自定义布局管理器)
        2.2.4、 布局管理器 不是界面部件 而是界面部件的定位策略

            

    2.3、 QBoxLayout布局管理器
        2.3.1、 以水平或者垂直的方式管理界面组件

                

                 


    2.4、布局管理器可以互相嵌套,形成更加复杂的布局形式
        2.4.1、 布局嵌套 几乎可以完成所有 常用的界面布局
        2.4.2、 自定义布局类 可以达到 个性化界面布局 的效果

                        

QLayoutManaget.h


#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QPushButton>
class Widget : public QWidget
{
    Q_OBJECT
private:
    QPushButton btn1;
    QPushButton btn2;
    QPushButton btn3;
    QPushButton btn4;
    void QLayoutTest();
    
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};
#endif // WIDGET_H


QLayoutManaget.cpp


#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent), btn1(this), btn2(this), btn3(this), btn4(this)
{
    QLayoutTest();
}
void Widget::QLayoutTest()
{
    btn1.setText("btn1");
    btn2.setText("btn2");
    btn3.setText("btn3");
    btn4.setText("btn4");
    btn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);//控件的水平和垂直都随着主窗口的变化而变化。
    btn1.setMinimumSize(160,50);//设置最小大小
    btn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);//控件的水平和垂直都随着主窗口的变化而变化。
    btn2.setMinimumSize(160,50);
    btn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);//控件的水平和垂直都随着主窗口的变化而变化。
    btn3.setMinimumSize(160,50);
    btn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);//控件的水平和垂直都随着主窗口的变化而变化。
    btn4.setMinimumSize(160,50);
    QHBoxLayout* hlayout1 = new QHBoxLayout();
    QHBoxLayout* hlayout2 = new QHBoxLayout();
    QVBoxLayout* vlayout = new QVBoxLayout();
    hlayout1->addWidget(&btn1);
    hlayout1->addWidget(&btn2);     //添加控件。
    hlayout2->addWidget(&btn3);
    hlayout2->addWidget(&btn4);
    vlayout->addLayout(hlayout1);//布局管理器的嵌套
    vlayout->addLayout(hlayout2);//注意这里是addLayout
    vlayout->setSpacing(20);//设置这个垂直布局中子布局之间的间距大小
    this->setLayout(vlayout);//设置布局管理器
}
Widget::~Widget()
{
    
}


main.cpp

#include <QtGui/QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}


3、小结

    3.1、 绝对定位 的布局方式 无法自适应窗口的变化
    3.2、 Qt提供相关的类对界面组件 进行布局管理
    3.3、 Qt预定义了 功能各异且互补 的布局管理器
    3.4、 布局管理器 能够互相嵌套 形成复杂的布局






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值