目录
5.2 setAutoFillBackground(true) 填充背景色
前言:
本文基于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
通过信号控制多层窗口的显示。注意,设计时的“小三角”并不显示。