22_布局管理器(一)

关键词:布局管理器、QLayoutQBoxLayout布局管理器、布局管理器的嵌套

1. 绝对定位

目前的GUI开发方式:绝对定位——直接在像素级指定各个组件的位置大小
void QWidget::move(int x, int y)
void QWidget::resize(int w, int h)

问题:组件的位置和大小无法自适应父窗口的变化
解决方案: 布局管理器

2. 布局管理器

  • 提供相关的类对界面组件进行布局管理
    1) 能够自动排列窗口中的界面组件
    2) 窗口变化后自动更新界面组件的大小

  • QLayout是Qt中布局管理器的抽象类

  • 通过继承QLayout实现了功能各异且互补的布局管理器

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

  • 布局管理器不是界面部件, 而是界面部件的定位策略

3. QBoxLayout布局管理器

  • 水平垂直的方式管理界面组件

void Layout::testVBoxLayout()
{
    QVBoxLayout* layout = new QVBoxLayout();    // 定义layout

    testBtn1.setText("Button 1");
    testBtn1.setSizePolicy(QSizePolicy::Expanding,
                           QSizePolicy::Expanding); // 设置大小策略
    testBtn1.setMinimumSize(160, 30);           // 设置最小尺寸

    testBtn2.setText("Button 2");
    testBtn2.setSizePolicy(QSizePolicy::Expanding,
                           QSizePolicy::Expanding);
    testBtn2.setMinimumSize(160, 30);

    testBtn3.setText("Button 3");
    testBtn3.setSizePolicy(QSizePolicy::Expanding,
                           QSizePolicy::Expanding);
    testBtn3.setMinimumSize(160, 30);

    testBtn4.setText("Button 4");
    testBtn4.setSizePolicy(QSizePolicy::Expanding,
                           QSizePolicy::Expanding);
    testBtn4.setMinimumSize(160, 30);

    layout->addWidget(&testBtn1);       // 为layout中添加组建
    layout->addWidget(&testBtn2);
    layout->addWidget(&testBtn3);
    layout->addWidget(&testBtn4);
    layout->setSpacing(30);             // 设置组建间距离

    setLayout(layout);
}

4. 布局管理器的嵌套

  • 布局管理器可以相互嵌套,形成更加复杂的布局方式
    1)布局嵌套几乎可以完成所有常用的界面布局
    2) 自定义布局类可以达到个性化界面布局的效果
  • QBoxLayout嵌套实例
void Widget::testVHBoxLayout()
{
    QVBoxLayout* vLayout = new QVBoxLayout();
    QHBoxLayout* hLayoutTop = new QHBoxLayout();
    QHBoxLayout* hLayoutButtom = 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);

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

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

    vLayout->setSpacing(10);
    vLayout->addLayout(hLayoutTop);
    vLayout->addLayout(hLayoutButtom);

    setLayout(vLayout);
}

5. 小结

  • 绝对定位的布局方式无法自适应窗口的变化
  • Qt提供了相关的类对界面组件进行布局管理
  • Qt预定义了功能各异且互补的布局管理器
  • 布局管理器能够相互嵌套形成复杂的布局

声明:此文章仅是本人在学习狄泰QT实验分析课程所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。