布局管理器的比例系数
1 默认情况下以等比例的方式跟新组件的大小
2 可以自定义组件大小更新时的比例系数
QBoxLayout 布局管理器中的比例系数
QBoxLayout 布局管理器中的比例系数设置方法
void QBoxLayout::setStretch ( int index, int stretch )
bool QBoxLayout::setStretchFactor ( QWidget * widget, int stretch )
bool QBoxLayout::setStretchFactor ( QLayout* layout, int stretch )
/* 指定 QBoxLayout中的某个下标的格子 大小比例系数
index : QBoxLayout中的格子下标 即 id
stretch : 比例系数
*/
void QBoxLayout::setStretch ( int index, int stretch )
/* 指定 QBoxLayout中的某个具体组件的 大小比例系数
如果指定组件不存在于 当前QBoxLayout当中时,返回false
存在 返回true
*/
bool QBoxLayout::setStretchFactor ( QWidget * widget, int stretch )
/* 指定 QBoxLayout中的某个具体布局管理器的 大小比例系数
如果指定布局管理器不存在于 当前QBoxLayout当中时,返回false
存在 返回true
/
bool QBoxLayout::setStretchFactor ( QLayout layout, int stretch )
组件的初始大小是独立于布局管理器设置的,因此 不能保证组件的大小始终符合比例系数的设置!
如
1 先设置组件的最小size
2 将组件add到布局管理器
3 指定布局管理器 中组件的大小比例系数
这种情况就是 布局管理器无法决定组件的初始大小比例,因为在加入到布局管理器之前 已经设置了组件的最小size
QGridLayout 网格布局管理器
QGridLayout设置布局管理器方法
//以行为单位 设置比例系数
void QGridLayout::setRowStretch ( int row, int stretch )
//以列为单位 设置比例系数
void QGridLayout::setColumnStretch ( int column, int stretch )
实验:
Widget.h
#ifndef _WIDGET_H_
#define _WIDGET_H_
#include <QtGui/QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
private:
QPushButton TestBtn1;
QPushButton TestBtn2;
QPushButton TestBtn3;
QPushButton TestBtn4;
void initControl();
void testVBoxLayout();
void testHBoxLayout();
void testVHBoxLayout();
void testQGridLayout();
void testQGridLayout2();
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif
Widget.cpp
#include "Widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent) : QWidget(parent),
TestBtn1(this), TestBtn2(this), TestBtn3(this), TestBtn4(this)
{
//initControl();
//testVBoxLayout();//QHBoxLayout 垂直布局管理器
//testHBoxLayout();//QVBoxLayout 水平布局管理器
//testVHBoxLayout();//垂直布局管理器 管理 两个水平布局管理器
//testQGridLayout();//QGridLayout 网格布局管理,以网格方式管理用户组件
//testQGridLayout2();//QGridLayout 网格布局管理 以跨行跨列方式管理用户组件
}
//布局管理器嵌套
void Widget::testVHBoxLayout()
{
QHBoxLayout* hLayout1 = new QHBoxLayout();
QHBoxLayout* hLayout2 = new QHBoxLayout();
QVBoxLayout* vLayout = new QVBoxLayout();
TestBtn1.setText("Test Button 1");
TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn1.setMinimumSize(160, 30);
TestBtn2.setText("Test Button 2");
TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn2.setMinimumSize(160, 30);
hLayout1->setSpacing(10);
hLayout1->addWidget(&TestBtn1);
hLayout1->addWidget(&TestBtn2);
TestBtn3.setText("Test Button 3");
TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn3.setMinimumSize(160, 30);
TestBtn4.setText("Test Button 4");
TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn4.setMinimumSize(160, 30);
hLayout2->setSpacing(10);
hLayout2->addWidget(&TestBtn3);
hLayout2->addWidget(&TestBtn4);
vLayout->setSpacing(10);
vLayout->addLayout(hLayout1);
vLayout->addLayout(hLayout2);
/* 通过 setStretchFactor ( QLayout * layout, int stretch ) 指定目标布管理器 比例系数
bool QBoxLayout::setStretchFactor ( QLayout * layout, int stretch )
*/
vLayout->setStretchFactor(hLayout1, 1);
vLayout->setStretchFactor(hLayout2, 3);
setLayout(vLayout);
}
//水平布局管理器 QHBoxLayout
void Widget::testHBoxLayout()
{
QHBoxLayout* layout = new QHBoxLayout();
TestBtn1.setText("Test Button 1");
TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn1.setMinimumSize(160, 30);
TestBtn2.setText("Test Button 2");
TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn2.setMinimumSize(160, 30);
TestBtn3.setText("Test Button 3");
TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn3.setMinimumSize(160, 30);
TestBtn4.setText("Test Button 4");
TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn4.setMinimumSize(160, 30);
layout->setSpacing(30);
layout->addWidget(&TestBtn1);
layout->addWidget(&TestBtn2);
layout->addWidget(&TestBtn3);
layout->addWidget(&TestBtn4);
/* 通过 setStretchFactor() 设置指定窗口 大小比例系数
bool QBoxLayout::setStretchFactor ( QWidget * widget, int stretch )
QPushButton:public QAbstractButton:public QWidget
*/
layout->setStretchFactor(&TestBtn1, 1);
layout->setStretchFactor(&TestBtn2, 2);
layout->setStretchFactor(&TestBtn3, 1);
layout->setStretchFactor(&TestBtn4, 3);
setLayout(layout);
}
//垂直布局管理器 QVBoxLayout
void Widget::testVBoxLayout()
{
QVBoxLayout* layout = new QVBoxLayout();
TestBtn1.setText("Test Button 1");
TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn1.setMinimumSize(160, 30);
TestBtn2.setText("Test Button 2");
TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn2.setMinimumSize(160, 30);
TestBtn3.setText("Test Button 3");
TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn3.setMinimumSize(160, 30);
TestBtn4.setText("Test Button 4");
TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn4.setMinimumSize(160, 30);
layout->setSpacing(30);
layout->addWidget(&TestBtn1);
layout->addWidget(&TestBtn2);
layout->addWidget(&TestBtn3);
layout->addWidget(&TestBtn4);
/* 通过 setStretch() 设置指定格子 大小比例系数
void QBoxLayout::setStretch ( int index, int stretch )
*/
layout->setStretch(0, 1);
layout->setStretch(1, 1);
layout->setStretch(2, 2);
layout->setStretch(3, 2);
setLayout(layout);
}
//QGridLayout 以网格方式管理用户组件
void Widget::testQGridLayout()
{
QGridLayout* layout = new QGridLayout;
TestBtn1.setText("Test Button 1");
TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn1.setMinimumSize(160, 30);
TestBtn2.setText("Test Button 2");
TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn2.setMinimumSize(160, 30);
TestBtn3.setText("Test Button 3");
TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn3.setMinimumSize(160, 30);
TestBtn4.setText("Test Button 4");
TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn4.setMinimumSize(160, 30);
layout->setSpacing(30);
/* addWidget 以坐标形式添加组件到 QGridLayout
*/
layout->addWidget(&TestBtn1,0,0);
layout->addWidget(&TestBtn2,0,1);
layout->addWidget(&TestBtn3,1,0);
layout->addWidget(&TestBtn4,1,1);
/*
设置 第0行 比例因子为1
设置 第1行 比例因子为3
*/
layout->setRowStretch(0,1);
layout->setRowStretch(1,3);
/*
设置 第0列 比例因子为1
设置 第1列 比例因子为3
*/
layout->setColumnStretch(0,1);
layout->setColumnStretch(1,3);
setLayout(layout);
}
//QGridLayout 以跨行跨列方式管理用户组件
void Widget::testQGridLayout2()
{
QGridLayout* layout = new QGridLayout;
TestBtn1.setText("Test Button 1");
TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn1.setMinimumSize(160, 30);
TestBtn2.setText("Test Button 2");
TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn2.setMinimumSize(160, 30);
TestBtn3.setText("Test Button 3");
TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn3.setMinimumSize(160, 30);
TestBtn4.setText("Test Button 4");
TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
TestBtn4.setMinimumSize(160, 30);
layout->setSpacing(10);
/* addWidget 以坐标形式添加组件到 QGridLayout
*/
layout->addWidget(&TestBtn1, 0, 0, 2, 1);//坐标:0.0 大小:两个行单元 一个列单元
layout->addWidget(&TestBtn2, 0, 1, 2, 1);
//因为TestBtn1 TestBtn2 都占用两行,所以TestBtn3只能从第三行开始 即坐标:2.0 大小:一个行单元,两个列单元
layout->addWidget(&TestBtn3, 2, 0, 1, 2);
layout->addWidget(&TestBtn4, 3, 0, 1, 2);
setLayout(layout);
}
void Widget::initControl()
{
TestBtn1.setText("Test Button 1");
TestBtn1.move(20, 20);
TestBtn1.resize(160, 30);
TestBtn2.setText("Test Button 2");
TestBtn2.move(20, 70);
TestBtn2.resize(160, 30);
TestBtn3.setText("Test Button 3");
TestBtn3.move(20, 120);
TestBtn3.resize(160, 30);
TestBtn4.setText("Test Button 4");
TestBtn4.move(20, 170);
TestBtn4.resize(160, 30);
}
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();
}