第二十二课、布局管理器(一)------------------狄泰软件学院

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

1、直接在像素级指定各个组件的位置和大小

(1)、void Qwidget::move(int x, int y)

(2)、void Qwidget::resize(int x, int y)

2、问题:组件的大小和位置无法自适应父窗口的变化

二、布局管理器

1、Qt提供相关的类对界面组件进行布局管理

(1)、能够自动排列窗口中的界面组件

(2)、窗口变化后自动更新界面组件的大小

2、QLayout类

(1)、QLayout是Qt中布局管理器的抽象基类

(2)、通过继承QLayout实现了功能各异且互补的布局管理器

(3)、Qt中可以根据需要自定义布局管理器

(4)、布局管理器不是界面部件而是界面部件的定位策略

3、QBoxLayout布局管理器

(1)、以水平或者垂直的方式管理界面组件

4、布局管理器可以互相嵌套,形成更加复杂的布局形式

(1)、布局嵌套几乎可以完成所有常用的界面布局

(2)、自定义布局类可以达到个性化界面布局的效果

#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
Widget.h
#include "Widget.h"
#include <QVBoxLayout>

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);


    QVBoxLayout* vlayout1 = new QVBoxLayout();
    QVBoxLayout* vlayout2 = new QVBoxLayout();
    QHBoxLayout* hlayout  = new QHBoxLayout();
    vlayout1->addWidget(&Btn1);
    vlayout1->addWidget(&Btn2);
    vlayout2->addWidget(&Btn3);
    vlayout2->addWidget(&Btn4);

    hlayout->addLayout(vlayout1);//布局管理器的嵌套
    hlayout->addLayout(vlayout2);//注意这里是addLayout

    hlayout->setSpacing(10);//间距大小
    setLayout(hlayout);//设置布局管理器

}

Widget::~Widget()
{
    
}
Widget.cpp
#include <QtGui/QApplication>
#include "Widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}
main.cpp

三、小结

(1)、绝对定位的布局方式无法自适应窗口的变化

(2)、Qt提供相关的类对界面组件进行布局管理

(3)、Qt预定义了功能各异且互补的布局管理器

 (4)、布局管理器能够互相嵌套形成复杂的布局

posted @ 2017-02-15 22:47  lgc202  阅读(586)  评论(0编辑  收藏  举报