QT多窗口设计:子窗口覆盖窗口显示

目录

前言:

1. 演示

2. 总览

3. 窗口设计

3.1 主窗口

3.2 子窗口 

4. 代码 

4.1 设计思路 

4.2 主窗口 

4.3 子窗口

5. 补充

5.1 组件QSize属性的初始化

5.2 setAutoFillBackground(true) 填充背景色

6. 多窗口组件

6.1 QTabWidget

6.2 QStackedWidget


前言:

        本文基于QT框架的多界面设计,探究多个子界面切换,并覆盖主界面显示。
 

1. 演示

QT多窗口设计

2. 总览

         解决方案设计如下文档结构

        QtWidgetsApplication1为主界面,QtWidgetsClass1、QtWidgetsClass2均为子界面。

3. 窗口设计

3.1 主窗口

        widgetMainBar为子窗口要覆盖的主窗口栏。

3.2 子窗口 

4. 代码 

4.1 设计思路 

         通过重写主窗口的resizeEvent事件,在此函数内更新所有子界面的窗口大小。再通过信号控制子界面显示(show),隐藏(hide)。代码中有详细的注释,这里便不多赘述。

4.2 主窗口 

         QtWidgetsApplication1.h

// QtWidgetsApplication1.h
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication1.h"
#include "QtWidgetsClass2.h"
#include "QtWidgetsClass1.h"

class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT

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

protected:
    void resizeEvent(QResizeEvent* event);// 重写resizeEvent事件

public slots:
    void on_pBtnNextPageOne();
    void on_pBtnNextPageTwo();

    void resizeAllChildren(QSize size);

signals:
    void resize(QSize size);

private:
    Ui::QtWidgetsApplication1Class ui;
    QtWidgetsClass1* m_pWidget1;// 界面一
    QtWidgetsClass2* m_pWidget2;// 界面二
};

         QtWidgetsApplication1.cpp

// QtWidgetsApplication1.cpp
#include "QtWidgetsApplication1.h"

#include <QResizeEvent>
#include <qdebug.h>

QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    // ui.widgetMainBar 为功能栏
    m_pWidget1 = new QtWidgetsClass1(ui.widgetMainBar);
    //m_pWidget1 = new QtWidgetsClass(this);
    
    // QWidget作为界面的组件,在构造函数中,Size未被初始化。
    // 若作为界面(this),其Size则会被初始化为显示时的大小。
    //==========================================================================//
    //  即m_pWidget1的父亲是ui.widgetMainBar,而非this的话,这里的设置没什么效果
    m_pWidget1->resize(ui.widgetMainBar->size());

    m_pWidget1->hide();


    m_pWidget2 = new QtWidgetsClass2(ui.widgetMainBar);
    m_pWidget2->resize(ui.widgetMainBar->size());
    m_pWidget2->hide();

    connect(ui.pBtnOne, SIGNAL(clicked()), this, SLOT(on_pBtnNextPageOne()));
    connect(ui.pBtnTow, SIGNAL(clicked()), this, SLOT(on_pBtnNextPageTwo()));
    connect(this, SIGNAL(resize(QSize)), this, SLOT(resizeAllChildren(QSize)));
}

QtWidgetsApplication1::~QtWidgetsApplication1()
{
    delete m_pWidget1;
    delete m_pWidget2;
}

void QtWidgetsApplication1::resizeEvent(QResizeEvent* event)
{
    // 注意:构造结束后,系统会自动调用一次resizeEvent事件
   QMainWindow::resizeEvent(event);// 调用父亲的重写事件,继续自身窗口的改变
   emit resize(ui.widgetMainBar->size());// 发送信号,刷新子界面大小
}


void QtWidgetsApplication1::resizeAllChildren(QSize size)
{
    m_pWidget1->resize(ui.widgetMainBar->size());
    m_pWidget2->resize(ui.widgetMainBar->size());
}


void QtWidgetsApplication1::on_pBtnNextPageOne()
{
    // 由于构造函数内Size初始化的问题,添加判断
// 可以尝试注释下段代码看看效果
    if (m_pWidget1->size() != ui.widgetMainBar->size())
        m_pWidget1->resize(ui.widgetMainBar->size());

    m_pWidget1->show();
}

void QtWidgetsApplication1::on_pBtnNextPageTwo()
{
    if (m_pWidget2->size() != ui.widgetMainBar->size())
        m_pWidget2->resize(ui.widgetMainBar->size());

    m_pWidget2->show();
}

4.3 子窗口

        QtWidgetsClass1.h 

// QtWidgetsClass1.h
#pragma once

#include <QWidget>
#include "ui_QtWidgetsClass1.h"

class QtWidgetsClass1 : public QWidget
{
	Q_OBJECT

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

private:
	Ui::QtWidgetsClass1Class ui;
};

         QtWidgetsClass1.cpp

// QtWidgetsClass1.cpp
#include "QtWidgetsClass1.h"

QtWidgetsClass1::QtWidgetsClass1(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	// 点击按钮隐藏子页面
	connect(ui.pushButton, &QPushButton::clicked, this, [=]() {this->hide(); });

	// 设置页面背景(自动填充),默认背景是透明的,可以看到父界面的组件
	setAutoFillBackground(true);
}

QtWidgetsClass1::~QtWidgetsClass1()
{}

5. 补充

5.1 组件QSize属性的初始化

        经过测试,组件的QSize属性在构造函数中,当前界面this进行了初始化,而其内部组件并未初始化为显示时的大小。且构造时会触发一次resizeEvent重写事件,结果也是如此。 

5.2 setAutoFillBackground(true) 填充背景色

        界面默认背景为透明,因此是可以看到父窗口的布局的,所以要填充背景色,也可以在ui设计中勾选autoFillBackground属性或自己填充背景色。

6. 多窗口组件

        设计最方便的当然还是使用组件了。 

6.1 QTabWidget

        可以通过标题栏切换多个窗口

6.2 QStackedWidget

        通过信号控制多层窗口的显示。注意,设计时的“小三角”并不显示。 

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值