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、
布局管理器
能够互相嵌套
形成复杂的布局