第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实现了功能各异且互补的布局管理器

(4)Qt中可以根据需要自定义布局管理器

(5)布局管理器不是界面部件(不可见必性),而是界面部件的定位策略

(6)布局管理器可以相互嵌套,形成更加复杂的布局方式。布局嵌套几乎可以完成所有常用的界面布局。

(7)自定义布局类可以达到个性化界面布局的效果

3. QBoxLayout布局管理器

(1)以水平或垂直的方式管理界面

(2)QBoxLayout示意图

(3)QBoxLayout嵌套实例

【编程实验】绝对定位和布局管理器实例

//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);

    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);

    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);

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

Widget::~Widget()
{

}

4. 小结

(1)绝对定位的布局方式无法自适应窗口的变化

(2)Qt提供了相关的类对界面组件进行布局管理

(3)Qt预定义了功能各异且互补的布局管理器

(4)布局管理器能够相互嵌套形成复杂的布局

时间: 2024-12-19 07:58:21

第22课 布局管理器(一)的相关文章

第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)

第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.栈式布局管理器(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.表单布局支持嵌套,其它布局管理器可以作为子

【Swing 2】布局管理器上

很苦逼的是,每次想记录一个小程序,发现,要给别人讲清楚,总是得分很多模块讲解. 所以今天来讲下Swing组件的三大布局管理器. 参考:<Head First Java>第十三章 1. BorderLayout--边界布局 2. FlowLayout--顺序布局 3. BoxLayout--不知道叫啥 1. BorderLayout(边界布局) 该管理器把背景分成东南西北中五大块,这是框架默认的布局管理器 1 package demo; 2 3 import javax.swing.*; 4 i

JAVA_布局管理器

1 /* 范例名称:FlowLayout 用法举例 2 * 源文件名称:TestFlowLayout.java 3 * 要 点: 4 * 1. 布局管理器的概念和作用 5 * 2. FlowLayout的性质及用法 6 */ 7 8 import java.awt.*; 9 10 public class TestFlowLayout { 11 public static void main(String args[]) { 12 Frame f = new Frame("Flow Layout

2.2UI组件(一)布局管理器

所有的布局管理器都是ViewGroup的子类. 2.2.1线性布局LinearLayout android:orientation:可以控制竖排显示(vertical)或者横排显示(horizontal) LInearLayout不会自动换行,一旦屏幕排满之后后面的控件将看不到 基本上很多布局管理器都提供了相应的LayoutParams内部类,该内部类用于控制他们的子元素使他们都具有android:layout_gravity属性,概述性设置子元素在父容器 中的对齐方式 例子 1 <?xml v

Qt垂直/水平布局管理器(QBoxLayout,QHBoxLayout, QVBoxLayout)

1.解释 QBoxLayout:可以在水平方向或垂直方向上排列控件,由QHBoxLayout.QVBoxLayout所继承. QHBoxLayout:水平布局,在水平方向上排列控件. QVBoxLayout:垂直布局,在垂直方向上排列控件. 同时我们注意到水平布局.垂直布局除了构造时的方向(LeftToRight.TopToBottom)不同外,其它均相同. 2.示例代码 2.1QHBoxLayout, QVBoxLayout实现 1 #include "widget.h" 2 #in