窗口的布局

一、如何布局

      布局,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:上限与下限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值