第23课 布局管理器(二)

1. 布局管理器中的比例系数

(1)默认情况下以等比例的方式更新组件大小

(2)可以自定义组件大小更新时的比例系数

2. QBoxLayout中的比例系数设置

(1)void setStretch(int index, int stretch); //设置指定索引对象的比例系数

(2)bool setStretchFactor(QWidget* widget, int stretch);

(3)bool setStretchFactor(QLayout* layout, int stretch);

  ▲组件的初始大小独立于布局管理器设置的,因此不能保证组件的大小始终符合比例系统的设置。即当组件初次被显示时,其初始大小会以自己的方式显示比例系数只有在其后大小发生变化时,才会起作用

【编程实验】比例系数初探

//main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

//Widget.h

#ifndef _WIDGET_H_
#define _WIDGET_H_

#include <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(); //嵌套布局

public:
    Widget(QWidget* parent = 0);
    ~Widget();
};

#endif  //_WIDGET_H_

//Widget.cpp

#include "Widget.h"
#include <QBoxLayout>
#include <QDebug>

Widget::Widget(QWidget* parent):QWidget(parent),
     TestBtn1(this),TestBtn2(this),TestBtn3(this),TestBtn4(this)
{
    TestBtn1.setText("Test Button 1");
    TestBtn2.setText("Test Button 2");
    TestBtn3.setText("Test Button 3");
    TestBtn4.setText("Test Button 4");

    //绝对定位
    //initControl(); //存在问题:位置和大小不能随父窗口的变化而变化

    //垂直布局
    testVBoxLayout();

    //水平布局
    //testHBoxLayout();

    //嵌套布局
    //testVHBoxLayout();

}

void Widget::initControl()
{
    TestBtn1.move(20, 20);
    TestBtn1.resize(160, 30);

    TestBtn2.move(20, 70);
    TestBtn2.resize(160, 30);

    TestBtn3.move(20, 120);
    TestBtn3.resize(160, 30);

    TestBtn4.move(20, 170);
    TestBtn4.resize(160, 30);
}

void Widget::testVBoxLayout()
{
    QVBoxLayout* layout = new QVBoxLayout();

    //水平和垂直方向扩展
    TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn1.setMinimumSize(160, 30);

    TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn2.setMinimumSize(160, 30);

    TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn3.setMinimumSize(160, 30);

    TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn4.setMinimumSize(160, 30);

    layout->setSpacing(10); //间距10
    layout->addWidget(&TestBtn1);
    layout->addWidget(&TestBtn2);
    layout->addWidget(&TestBtn3);
    layout->addWidget(&TestBtn4);

    //通过索引设置比例系数
    layout->setStretch(0, 1);
    layout->setStretch(1, 1);
    layout->setStretch(2, 2);
    layout->setStretch(3, 2);

    setLayout(layout);//设置到本Widget对象,让布局对象生效

}

void Widget::testHBoxLayout()
{
    QHBoxLayout* layout = new QHBoxLayout();

    //水平和垂直方向扩展
    TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn1.setMinimumSize(160, 30);

    TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn2.setMinimumSize(160, 30);

    TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn3.setMinimumSize(160, 30);

    TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn4.setMinimumSize(160, 30);

    layout->setSpacing(10); //间距10
    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);//设置到本Widget对象,让布局对象生效
}

void Widget::testVHBoxLayout()
{
    QHBoxLayout* hLayout1 = new QHBoxLayout();
    QHBoxLayout* hLayout2 = new QHBoxLayout();

    QVBoxLayout* vLayout = new QVBoxLayout();

    //水平和垂直方向扩展
    TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn1.setMinimumSize(160, 30);

    TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn2.setMinimumSize(160, 30);

    hLayout1->setSpacing(10);
    hLayout1->addWidget(&TestBtn1);
    hLayout1->addWidget(&TestBtn2);

    TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn3.setMinimumSize(160, 30);

    TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn4.setMinimumSize(160, 30);

    hLayout2->setSpacing(10);
    hLayout2->addWidget(&TestBtn3);
    hLayout2->addWidget(&TestBtn4);

    vLayout->setSpacing(10); //间距10
    vLayout->addLayout(hLayout1);
    vLayout->addLayout(hLayout2);

    //1:3
    vLayout->setStretchFactor(hLayout1, 1);
    vLayout->setStretchFactor(hLayout2, 3);

    setLayout(vLayout);//设置到本Widget对象,让布局对象生效
    vLayout->update();
}

Widget::~Widget()
{

}

3. QGridLayout布局管理器

(1)以网格(二维)的方式管理界面组件

(2)QGridLayout中的比例系数设置

  ①void setColumnStretch(int column, int stretch);//设置指定列的比例系数

  ②void setRowStretch(int row, int stretch);     //设置指定行的比例系数

(3)QGridLayout支持嵌套其它布局管理器成为其管理对象

【编程实验】QGridLayout分析

//main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

//Widget.h

#ifndef _WIDGET_H_
#define _WIDGET_H_

#include <QWidget>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT
private:
    QPushButton TestBtn1;
    QPushButton TestBtn2;
    QPushButton TestBtn3;
    QPushButton TestBtn4;

    void testGridLayout1();  //一般的网格布局
    void testGridLayout2();  //跨越网格的布局

public:
    Widget(QWidget* parent = 0);
    ~Widget();
};

#endif  //_WIDGET_H_

//Widget.cpp

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

Widget::Widget(QWidget* parent):QWidget(parent),
     TestBtn1(this),TestBtn2(this),TestBtn3(this),TestBtn4(this)
{
    TestBtn1.setText("Test Button 1");
    TestBtn2.setText("Test Button 2");
    TestBtn3.setText("Test Button 3");
    TestBtn4.setText("Test Button 4");

    //一般的网格布局
    //testGridLayout1();

    //跨越网格的布局(不建议这样用)
    testGridLayout2();
}

void Widget::testGridLayout1()
{
    QGridLayout* layout = new QGridLayout();

    //水平和垂直方向扩展
    TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn1.setMinimumSize(160, 30);

    TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn2.setMinimumSize(160, 30);

    TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn3.setMinimumSize(160, 30);

    TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn4.setMinimumSize(160, 30);

    layout->setSpacing(10); //间距10
    layout->addWidget(&TestBtn1, 0, 0); //第0行0列
    layout->addWidget(&TestBtn2, 0, 1); //第0行1列
    layout->addWidget(&TestBtn3, 1, 0); //第1行0列
    layout->addWidget(&TestBtn4, 1, 1); //第1行1列

    //设置比例系数
    layout->setRowStretch(0, 1); //第0行,比例系数为1
    layout->setRowStretch(1, 3); //第1行,比例系数为1
    layout->setColumnStretch(0, 1); //第0列,比例系数为1
    layout->setColumnStretch(1, 3); //第1列,比例系数为3

    setLayout(layout);//设置到本Widget对象,让布局对象生效

}

void Widget::testGridLayout2()
{
    QGridLayout* layout = new QGridLayout();

    //水平和垂直方向扩展
    TestBtn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn1.setMinimumSize(160, 30);

    TestBtn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn2.setMinimumSize(160, 30);

    TestBtn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn3.setMinimumSize(160, 30);

    TestBtn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    TestBtn4.setMinimumSize(160, 30);

    layout->setSpacing(10); //间距10
    //addWidget(QWidget *widget, int fromRow, int fromColumn,
    //                           int rowSpan, int columnSpan,
    //                           Qt::Alignment alignment = Qt::Alignment())
    layout->addWidget(&TestBtn1, 0, 0, 2, 1); //从(0,0)开始,占2行1列
    layout->addWidget(&TestBtn2, 0, 1, 2, 1); //从(0,1)开始,占2行1列
    layout->addWidget(&TestBtn3, 2, 0, 1, 2); //从(2,0)开始,占1行2列
    layout->addWidget(&TestBtn4, 3, 0, 1, 2); //从(3,0)开始,占1行2列

    setLayout(layout);//设置到本Widget对象,让布局对象生效

}

Widget::~Widget()
{

}

4. 小结

(1)QGridLayout以网格的方式对组件进行管理

(2)QGridLayout中的组件可以根据需要跨越多个网格

(3)QBoxLayout和QGridLayout支持比例系数的概念

(4)比例系数决定了组件大小的相对变化

时间: 2024-10-14 04:27:53

第23课 布局管理器(二)的相关文章

第22课 布局管理器(一)

1. 绝对定位及存在的问题 (1)直接在像素级指定各个组件的位置和大小 void QWidget::move(int x, int y) void QWidget::resize(int w, int h); (2)存在问题:组件的位置和大小无法自适应父窗口的变化 2. 布局管理器 (1)提供相关的类对界面组件进行布局管理 ①能够自动排列窗口中的界面组件 ②窗口变化后自动更新界面组件的大小 (2)QLayout是Qt中布局管理器的抽象基类 (3)通过继承QLayout实现了功能各异且互补的布局管

第24课 布局管理器(三)

1. 登录界面的几种实现 (1)绝对定位组件的坐标和大小 (2)嵌套QBoxLayout (3)创建3×2的QGridLayout [实例分析]QGridLayout的实现示例 2. QFormLayout布局管理器 (1)以表单(Form)的方式管理界面组件 (2)表单布局中的标签和组件是相互对应的关系 (3)表单布局支持嵌套,其它布局管理器可以作为子布局被其管理 (4)QFormLayout的用法概要 ①void addRow(QWidget* label, QWidget* field);

第25课 布局管理器(四)

1. 栈式布局管理器(QStackedLayout) (1)所有组件在垂直于屏幕的方向上被管理 (2)每次只有一个组件会显示在屏幕上(类似于窗口的Z-Order,但只能显示最顶层的) (3)只有最顶层的组件会被最终显示 2. 栈式布局管理器的特点 (1)组件大小一致且充满父组件的显示区 (2)不能直接嵌套其它布局管理器,但可以将一些组件放入一个layout,再将这个layout作为一个Widget的布局管理器.最后通过QStackedLayout.addWidget以达到嵌套的目的. (3)能够

布局管理器二

一.概念认知 1.1 BorderLayout 如果想在中间区域多放几个就在中间添加一个Panel容器 1.2 GridLayout 二.代码示例  2.1 BorderLayout import java.awt.*; public class TestBorderLayout { public static void main(String[] args) { Frame f=new Frame("秋夕"); //设置需要添加额的按钮组件 Button b1=new Button(

QT开发(二十一)——QT布局管理器

QT开发(二十一)--QT布局管理器 一.布局管理器简介 QT中使用绝对定位的布局方式无法自适应窗口的变化. QT中提供了对界面组件进行布局管理的类,用于对界面组件进行管理,能够自动排列窗口中的界面组件,窗口大小变化后自动更新界面组件的大小. QLayout是QT中布局管理器的抽象基类,通过对QLayout的继承,实现了功能各异且互补的布局管理器. 布局管理器不是界面组件,而是界面组件的定位策略. 任意容器类型的组件都可以指定布局管理器. 同一个布局管理器管理中的组件拥有相同的父组件,在设置布局

Java之GUI编程(二)——布局管理器

在上篇博客Java之GUI编程(一)中我已经对GUI编程的组件和事件做了简单介绍了,现在来看看另外一部分关于组件在各个平台是如何做到仍能保持自己合理的位置大小以及外观的. 已经说了Java是跨平台运行的,但是不同的平台对于点及坐标的定义不完全相同.而且屏幕的解析度分辨率不同也会造成位置的变化,为了确保每个组件的相对位置和大小以及外观,java就设计了布局管理器. 布局管理器是对容器中的元素进行管理,按照一定的规则排放容器里面的元素.它控制了组件的摆放. 布局管理器分类: FlowLayout:浮

Qt布局管理器的使用(二)

 Qt布局管理器的使用(二) 前面博文(http://blog.csdn.net/u013704336/article/details/38960353)讲解了手动布局的基本思路,今天说下用代码怎样进行一些常用的简单布局. 首先,心中要规划好,自己要实现的模块的分布可以事先在纸上进行大致的绘制,然后心中就有了大致的轮廓. 今天就按照上次讲的,实现那个录入商品信息的布局吧.如下图所示: 仔细观察,就可以发现这个布局的思想.基本都是水平布局,然后再将各自布局进行垂直布局,好了,说了这么多废话,直接上

第二十五课、布局管理器(四)

一.栈式布局管理器 1.栈式布局管理器(QStatckedLayout)概要 (1).所有组件垂直于屏幕的方向上被管理 (2).每次只有一个组件会显示在屏幕上 (3).只有最顶层的组件会被最终显示 2.栈式布局管理器的特点 (1).组件大小一致且充满父组件的显示区 (2).不能直接嵌套其它布局管理器(可以依赖中间组件间接嵌套) (3).能够自由切换需要显示的组件 (4).每次能且仅能显示一个组件 3.QStatckedLayout的用法概要 二.计时器 1.计时器的概念 (1).计时器是工程开发

第二十四课、布局管理器(三)

一.如何实现下面的用户界面 1.解决方法 (1).绝对定位组件的坐标和大小 (2).嵌套QBoxLayout (3).创建3x2的QGridLayout 编程实验:  Widget.h  Widget.cpp  main.cpp 二.QFormLayout布局管理器 1.以表单(Form)的方式管理界面组件 2.表单布局中的标签和组件是相互对应的关系 3.QFormLayout的用法概要          4.QFormLayout的样式函数    5.表单布局支持嵌套,其它布局管理器可以作为子