窗口的布局

来源:互联网 发布:网购电影票软件 编辑:程序博客网 时间:2024/06/05 03:11

一、如何布局

      布局,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();//得到纵向的policyQSize 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:上限与下限