您的位置:首页 > 其它

第22课 布局管理器(一)

2018-03-18 15:32 106 查看

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_OBJECTprivate:    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、 布局管理器能够互相嵌套形成复杂的布局
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: