一、如何布局
布局,layout,就是把各个控件放在合适的位置,占据适当大小的空间。
在QT中,使用布局器QLayout进行布局
1.它为我们自动计算各个控件的大小和位置
2.当父窗口调整是,它根据既定策略Policy来调整各个子窗口的大小和位置。
两个常用的QLayout子类:
QHBoxLayout:横向布局
QVBoxLayout:纵向布局
例1创建一个界面:上面是一个单行文本框,下面是一个文本编辑框
#ifndef MYWIN_H
#define MYWIN_H
#include <QWidget>
#include<QVBoxLayout>
#include<QLineEdit>
#include<QPlainTextEdit>
class MyWin:public QWidget
{
Q_OBJECT
public:
MyWin(QWidget* parent);
~MyWin();
private:
QLineEdit* m_lineEdit;
QPlainTextEdit* m_textEdit;
}
#include "MyWin.h"
MyWin::MyWin(QWidget* parent):QWidget(parent)
{
//创建控件对象
m_lineEdit=new QLineEdIt(this);
m_textEdit=new QPlainTextEdit(this);
//创建布局器
QVBoxLayout* layout=new QVBoxLayout(this);
layout->addWidget(m_lineEdit);
layout->addWidget(m_textEdit);
//使用布局器
this->setLayout(layout);
}
MyWin::~MyWin()
{}
#include <QtGui/QApplication>
#include "MyWin.h"
int main(int argc,char * argv[])
{
QApplication a(argc,argv);
MyWin a(NULL);
w.resize(400,300);//设置大小
w.move(100,100);//指定位置
w.show();
return a.exec();
}
二、窗口大小调整的策略
SizePolicy:用于描述一个Widget被resizing(调整大小)的时候
在QSizePolicy类中定义了七种策略
Fixed:使用sizeHint,不能更大不能更小
Minimum:不得小于sizeHint,可以更大,但不需要更小
Maximum:不得大于sizeHint,可以更小
Preferred:优先使用sizeHint,越大越好
Expanding:使用sizeHint,越大越好
MinimumExpanding:不得小于sizeHint,越大越好
lgnore:忽略sizeHint,越大越好
相关的函数
//获取当前的policy
QSizePolicy QWidget::sizePolicy()const
//设置新的policy
void setSizePolicy(QSizePolicy)
void setSizePolicy(QSizePolicy::Policy horizontal,QSizePolicy::Policy::Policy vertical)
SizeHint 是有QWidget类有函数 virtual QSizesizeHint()const;来得到
每一种Widget窗口都需要重写这个函数
作用:向布局器声明自己需要的空间大小
注意:sizeHint和sizePolicy,都是提供给布局器的信心,布局器QLayout会根据这两个信息来决定这个窗口控件的实际尺寸。
例2:把例1的程序使用sizeHint和sizePolicy进行调整
#include "MyWin.h"
MyWin::MyWin(QWidget *parent)
: QWidget(parent)
{
// 创建控件对象
m_lineEdit = new QLineEdit(this);
m_textEdit = new QPlainTextEdit(this);
// 观察sizeHint的值,sizePolicy的值
QSize sh = m_lineEdit->sizeHint();//得到推荐的大小
QSizePolicy p = m_lineEdit->sizePolicy();.//得到policy的类
QSizePolicy::Policy vp = p.verticalPolicy();//得到纵向的policy
QSize sh2 = m_textEdit->sizeHint();
QSizePolicy p2 = m_textEdit->sizePolicy();
QSizePolicy::Policy vp2 = p2.verticalPolicy();
// 设置上面的LineEdit的Policy
// m_lineEdit->setSizePolicy(QSizePolicy::Fixed,
// QSizePolicy::Expanding);//横向Fixed纵向Expanding
// 创建布局器
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(m_lineEdit); // 将第一个box添加到布局器
layout->addWidget(m_textEdit); // 将多行文本框添加到布局器
// ʹ使用布局器
this->setLayout(layout);
}
MyWin::~MyWin()
{
}
例3:一个界面中可以使用多个布局器先横向使用一个再纵向使用一个
#include "MyWin.h" #include <QHBoxLayout> #include <QVBoxLayout> MyWin::MyWin(QWidget *parent) : QWidget(parent) { m_button = new QPushButton(this); m_button->setText("OK"); m_lineEdit = new QLineEdit(this); m_textEdit = new QPlainTextEdit(this); QHBoxLayout* layout1 = new QHBoxLayout(); //先创建一个横向布局器 layout1->addWidget(m_lineEdit); layout1->addWidget(m_button);//把第一行的单行文本框和按键用横向布局器布局 QVBoxLayout* layout2 = new QVBoxLayout(); layout2->addLayout(layout1); // 把layout1添加到纵向布局器中 layout2->addWidget(m_textEdit); this->setLayout(layout2); } MyWin::~MyWin() {
}如果用可视化布局,可以通过打散和组合按钮来实现布局
三、布局参数
sizeHint :推荐大小
sizepolicy :策略
stretch factor :拉伸因子
maximum size/minimum size:上限与下限