Qt 布局管理器的层级关系

1、HomeWidget.h头文件:

复制代码
#ifndef HOMEWIDGET_H
#define HOMEWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>


class HomeWidget : public QWidget
{
    Q_OBJECT

public:
    HomeWidget(QWidget *parent = nullptr);
    ~HomeWidget();

    // 3、声明一个QWidget对象
    QWidget *mainWidget;
    QWidget *topWidget;
    QWidget *leftWidget;
    QWidget *rightWidget;
    QWidget *bottomWidget;

    // 主布局
    QVBoxLayout *mainLayout;
    QHBoxLayout *middleLayout;

    // 各部件内部布局
    QVBoxLayout *topLayout;
    QVBoxLayout *leftLayout;
    QVBoxLayout *rightLayout;
    QHBoxLayout *bottomLayout;




};
#endif // HOMEWIDGET_H

2、HomeWidget.cpp类的实现:

复制代码
#include "HomeWidget.h"

HomeWidget::HomeWidget(QWidget *parent)
    : QWidget(parent)
{
    // 覆盖在顶层窗口之上的QWidget主部件
    mainWidget = new QWidget(this);
    // 创建各个区域的部件
    topWidget = new QWidget(mainWidget);
    leftWidget = new QWidget(mainWidget);
    rightWidget = new QWidget(mainWidget);
    bottomWidget = new QWidget(mainWidget);

    // 为顶层窗口设置布局规则
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(mainWidget);

    // 设置主部件的布局规则
    mainLayout = new QVBoxLayout(mainWidget);
    // 1、将topWidget添加到主布局中
    mainLayout->addWidget(topWidget);
    // 2、设置中间部件的布局
    middleLayout = new QHBoxLayout();
    middleLayout->addWidget(leftWidget);
    middleLayout->addWidget(rightWidget);
    mainLayout->addLayout(middleLayout);
    // 3、将topWidget添加到主布局中
    mainLayout->addWidget(bottomWidget);


/**
 *
 1、在Qt里,把一个部件设置为另一个部件的子部件,和把这个部件添加到布局管理器中,这是两个不同的操作,它们有着不同的作用:
(1)设置子部件:
  topWidget = new QWidget(mainWidget);
    此操作让topWidget在 GUI 的层级结构里,成为mainWidget的子部件;
    从视觉呈现上来说,topWidget会被显示在mainWidget的区域范围之内;
    不过,此时topWidget的具体位置和大小并没有被确定,它默认会出现在父部件的左上角,尺寸则是系统设定的默认值;
(2)添加到布局管理器:
  mainLayout->addWidget(topWidget);
    该操作把topWidget纳入到mainLayout的管理体系之中;
    布局管理器会对topWidget的几何属性,也就是位置和大小进行计算和控制,使其能够根据布局规则,合理地填充分配到的空间;
    要是没有这一步操作,虽然部件已经存在于父部件之中,但不会按照预期的布局规则来显示;
 */


/**
 * 布局管理器的层级关系:
 *

HomeWidget(顶层窗口)
├─ layout(管理顶层窗口内的布局)
│  └─ mainWidget(mainWidget窗口,覆盖整个顶层窗口)
│     └─ mainLayout(管理mainWidget窗口内的布局)
│        ├─ topWidget(顶部窗口)
│        ├─ middleLayout(水平布局)
│        │  ├─ leftWidget(左侧窗口)
│        │  └─ rightWidget(右侧窗口)
│        └─ bottomWidget(底部窗口)

 */

    // 设置对象名称,以便在样式表中引用
    mainWidget->setObjectName("mainWidget");
    topWidget->setObjectName("topWidget");
    leftWidget->setObjectName("leftWidget");
    rightWidget->setObjectName("rightWidget");
    bottomWidget->setObjectName("bottomWidget");
    // 设置样式表
    QString style = R"(
        #mainWidget {
            background-color: black;
        }

        #topWidget {
            background-color: red;
        }

        #leftWidget {
            background-color: green;
        }

        #rightWidget {
            background-color: pink;
        }

        #bottomWidget {
            background-color: blue;
        }
     )";
    // 应用样式表到当前窗口
    setStyleSheet(style);






}

HomeWidget::~HomeWidget() {}

3、运行结果:

相关推荐
云边小网安2 小时前
java集合(十) ---- LinkedList 类
java·开发语言·青少年编程·java集合
Zephyrtoria3 小时前
区间合并:区间合并问题
java·开发语言·数据结构·算法
你怎么知道我是队长4 小时前
GO语言---匿名函数
开发语言·后端·golang
lansye4 小时前
侃侃AI编程
开发语言·qt·ai编程
uyeonashi5 小时前
【QT】窗口详解
开发语言·c++·qt·学习
Hello eveybody6 小时前
C++介绍整数二分与实数二分
开发语言·数据结构·c++·算法
jmlinux7 小时前
从 C 语言计算器到串口屏应用
c语言·开发语言
Mallow Flowers8 小时前
Python训练营-Day31-文件的拆分和使用
开发语言·人工智能·python·算法·机器学习
云边小网安8 小时前
java集合篇(六) ---- ListIterator 接口
java·开发语言·青少年编程·java集合
不被定义的程序猿8 小时前
Golang 在 Linux 平台上的并发控制
开发语言·后端·golang