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、运行结果:

相关推荐
yaoxin5211233 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫3 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
学逆向的4 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉4 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉4 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
凡人叶枫5 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员5 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean5 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
LabVIEW开发5 小时前
LabVIEW + MATLAB 混合编程:爆炸场测试数据精准采集方案
开发语言·matlab·labview
嵌入式协会20240725 小时前
(已解决)MinIO python 获取预签名出现forbidden、errornetwork等错误
java·开发语言·python