一、布局管理器

布局管理器中的比例系数
默认情况下以等比例的方式更新组件大小
可以自定义组件大小更新时的比例系数

QBoxLayout中的比例系数设置

void setStretch(int index,int stretch)   //格子对应的比例系数
bool setStretchFactor(Qwidget* widget,int stretch) //组件比例系数
bool setStretchFactor(QLayout* layout,int stretch)

组件的大小是独立于布局管理器设置的,因此不能保证组件的大小始终符合比例系数的设置!

二、编程实验 23-1.pro

QBoxLayout代码:

#include "Widget.h"
#include <QVBoxLayout>


Widget::Widget(QWidget *parent) : QWidget(parent),
    TestBtn1(this), TestBtn2(this), TestBtn3(this), TestBtn4(this)
{
    //initControl();

   //testHBoxLayout();
   // testVBoxLayout();
  // testVHBoxLayout();
   testVBoxLayout1();
   //testHBoxLayout1();
}

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);
    hlayout1->setStretchFactor(&TestBtn1,1);
    hlayout1->setStretchFactor(&TestBtn2,2);
    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->setStretchFactor(&TestBtn3,3);
    Vlayout->setStretchFactor(&TestBtn4,4);
    Vlayout->setSpacing(10); //设置空间间隔为10个像素
    Vlayout->addLayout(hlayout1,0); //是将子布局添加到父布局中
    Vlayout->addLayout(hlayout2,0);

    setLayout(Vlayout);//告诉窗口请布局管理器来管理窗口;
}
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); //设置空间间隔为30个像素
    layout->addWidget(&TestBtn1); //告诉布局管理器管理的界面组件有那些
    layout->addWidget(&TestBtn2);
    layout->addWidget(&TestBtn3);
    layout->addWidget(&TestBtn4);
    setLayout(layout);//告诉窗口请布局管理器来管理窗口;
}
void Widget::testVBoxLayout1()  //垂直布局管理器
{
    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); //设置空间间隔为30个像素
    layout->addWidget(&TestBtn1); //告诉布局管理器管理的界面组件有那些
    layout->addWidget(&TestBtn2);
    layout->addWidget(&TestBtn3);
    layout->addWidget(&TestBtn4);
    layout->setStretch(0,1);
    layout->setStretch(1,2);
    layout->setStretch(2,3);
    layout->setStretch(3,4);
    setLayout(layout);//告诉窗口请布局管理器来管理窗口;
}
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); //设置空间间隔为30个像素
    layout->addWidget(&TestBtn1); //告诉布局管理器管理的界面组件有那些
    layout->addWidget(&TestBtn2);
    layout->addWidget(&TestBtn3);
    layout->addWidget(&TestBtn4);
    setLayout(layout);//告诉窗口请布局管理器来管理窗口;
}
void Widget::testHBoxLayout1()  //水平布局管理器
{
    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); //设置空间间隔为30个像素
    layout->addWidget(&TestBtn1); //告诉布局管理器管理的界面组件有那些
    layout->addWidget(&TestBtn2);
    layout->addWidget(&TestBtn3);
    layout->addWidget(&TestBtn4);
    layout->setStretchFactor(&TestBtn1,1);
    layout->setStretchFactor(&TestBtn2,2);
    layout->setStretchFactor(&TestBtn3,1);
    layout->setStretchFactor(&TestBtn4,3);
    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()
{
    
}

QGridLayout布局管理器

以网格(二维)方式管理界面组件
image.png
QGridLayout中的比例系数设置

void setColumnStretch(int column,int strerch)  //列
void setRowStretch(int row,int stretch)  //行

三、编程实验 23-2.pro

#include "Widget.h"
#include <QGridLayout>

Widget::Widget(QWidget *parent) : QWidget(parent),
    TestBtn1(this), TestBtn2(this), TestBtn3(this), TestBtn4(this)
{
    //testGridLayout1();
    testGridLayout2();
}

void Widget::testGridLayout1()
{
    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);
    layout->addWidget(&TestBtn1, 0, 0);
    layout->addWidget(&TestBtn2, 0, 1);
    layout->addWidget(&TestBtn3, 1, 0);
    layout->addWidget(&TestBtn4, 1, 1);
    layout->setRowStretch(0, 1);
    layout->setRowStretch(1, 3);
   // layout->setColumnStretch(0, 1);
    //layout->setColumnStretch(1, 3);

    setLayout(layout);
}

void Widget::testGridLayout2()
{
    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);
    layout->addWidget(&TestBtn1, 0, 0, 2, 1); //位置0,0,占用2行一列
    layout->addWidget(&TestBtn2, 0, 1, 2, 1); //位置0,1,占用2行一列
    layout->addWidget(&TestBtn3, 2, 0, 1, 2); //位置2,1,占用1行2列
    layout->addWidget(&TestBtn4, 3, 0, 1, 2); //位置0,1,占用1行2列

    setLayout(layout);
}

Widget::~Widget()
{
    
}

布局管理器的嵌套

QGridLayout支持嵌套其他布局管理器成为其管理对象
image.png

四、小结

QGridLayout以网格的方式对组件进行管理
QGridLayout中的组件可以根据需要跨越多个网格
QBoxLayout和QGridLayout支持比例系数的概念
比例系数决定了组件大小的相对变化


YingLi
6 声望4 粉丝

From zero to hero.