QT5:多窗口跳转

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助
目录

前言

一、环境

二、步骤

三、代码实现

四、效果图


前言

学习使用qt5完成多窗口(界面)跳转:从主界面可分别跳转至界面一和界面二,从界面一可以返回主界面和跳转至界面二,界面二可返回对应的父界面(从主界面跳转则返回主界面,从界面一跳转则返回界面一)。


一、环境

qt版本:5.12.7

windows 11 下的 Qt Designer (已搭建)

编译器:MingGW


二、步骤

1.在Designer 创建一个新的qt工程

2.选中工程选择Add New.. 添加两个新的ui界面page1window和page2window,界面模板使用MainWindow。


3.在主界面创建两个button分别跳转至界面一和界面二。

4.在界面一创建两个button分别跳转至界面二和返回主界面。

5.在界面三创建一个button用于返回其父界面。

6.连接槽函数。


三、代码实现

mainwindow.h:

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QHBoxLayout>

#include "page1window.h"
#include "page2window.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_page1_button_clicked();

    void on_page2_button_clicked();

private:
    Ui::MainWindow *ui;
    Page1Window *page1=NULL;
    Page2Window *page2=NULL;

    QPushButton *page1_button=NULL;
    QPushButton *page2_button=NULL;
    QHBoxLayout *btn_hlayout; //水平布局


};
#endif // MAINWINDOW_H

mainwindow.cpp:

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QWidget *widget=new QWidget(this);
    this->setCentralWidget(widget); // 设置为中心部件

    btn_hlayout = new QHBoxLayout(widget);

    page1=new Page1Window(this);
    page1_button =new QPushButton("前往页面一");
    page2_button =new QPushButton("前往页面二");
    btn_hlayout->addWidget(page1_button);
    btn_hlayout->addWidget(page2_button);

    // 跳转到子窗口
    connect(page1_button, &QPushButton::clicked, this, &MainWindow::on_page1_button_clicked);

    //接收返回信号显示当前窗口
    connect(page1,&Page1Window::goback,this,[=](){page1->close();this->show();});


    Page2Window *Page2FrommMin = new class Page2FromMain(this); // 使用匿名内部类
    connect(page2_button, &QPushButton::clicked, this, [=]() {Page2FrommMin->show();this->hide();});


}

MainWindow::~MainWindow()
{
    delete ui;
}



void MainWindow::on_page1_button_clicked()
{
    this->hide();
    page1->show();
}



void MainWindow::on_page2_button_clicked()
{
    this->hide();
    page2->show();
}

pgge1window.h:

cpp 复制代码
#ifndef PAGE1WINDOW_H
#define PAGE1WINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QHBoxLayout>

namespace Ui {
class Page1Window;
}

class Page1Window : public QMainWindow
{
    Q_OBJECT

public:
    explicit Page1Window(QWidget *parent = nullptr);
    ~Page1Window();

signals:
    void goback();

private slots:
    void on_return_btn_clicked();


private:
    Ui::Page1Window *ui;

    QPushButton *return_button=NULL;
    QPushButton *page2_button=NULL;
    QHBoxLayout *btn_hlayout; //水平布局
};

#endif // PAGE1WINDOW_H

pgge1window.cpp:

cpp 复制代码
#include "page1window.h"
#include "ui_page1window.h"
#include "page2window.h"

Page1Window::Page1Window(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Page1Window)
{
    ui->setupUi(this);

    QWidget *widget=new QWidget(this);
    this->setCentralWidget(widget); // 设置为中心部件

    btn_hlayout = new QHBoxLayout(widget);


    return_button =new QPushButton("返回主页面");
    page2_button =new QPushButton("前往页面二");
    btn_hlayout->addWidget(return_button);
    btn_hlayout->addWidget(page2_button);


    connect(return_button, &QPushButton::clicked, this, &Page1Window::on_return_btn_clicked);

    Page2Window *Page2FrommPage1 = new class Page2FromPage1(this); // 使用匿名内部类
    connect(page2_button, &QPushButton::clicked, this, [=]() {Page2FrommPage1->show();this->hide();});
}

Page1Window::~Page1Window()
{
    delete ui;
}


void Page1Window::on_return_btn_clicked()
{
    emit goback();
}

pgge2window.h:

cpp 复制代码
#ifndef PAGE2WINDOW_H
#define PAGE2WINDOW_H

#include <QMainWindow>

#include <QPushButton>
#include <QHBoxLayout>


namespace Ui {
class Page2Window;
}

class Page2Window : public QMainWindow
{
    Q_OBJECT

public:
    explicit Page2Window(QWidget *parent = nullptr);
    ~Page2Window();

    virtual void on_return_btn_clicked() = 0; // 纯虚函数,需要在子类中实现

private:
    Ui::Page2Window *ui;

    QWidget *Widget;
    QPushButton *return_button;
    QHBoxLayout *btn_hlayout; //水平布局

};


//页面二(从主页面跳转)
class Page2FromMain : public Page2Window {
    QWidget *parentWindow1;
public:
    Page2FromMain(QWidget *parent = nullptr) : Page2Window(parent), parentWindow1(parent) {
    }

    void on_return_btn_clicked() override {
        parentWindow1->show();
        this->hide();
    }
};

//页面二(从页面一跳转)
class Page2FromPage1 : public Page2Window {
    QWidget *parentWindow2;
public:
    Page2FromPage1(QWidget *parent = nullptr) : Page2Window(parent), parentWindow2(parent) {
    }

    void on_return_btn_clicked() override {
        parentWindow2->show();
        this->hide();
    }
};

#endif // PAGE2WINDOW_H

pgge2window.cpp:

cpp 复制代码
#include "page2window.h"
#include "ui_page2window.h"

Page2Window::Page2Window(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Page2Window)
{
    ui->setupUi(this);

    QWidget *widget=new QWidget(this);
    this->setCentralWidget(widget); // 设置为中心部件

    btn_hlayout = new QHBoxLayout(widget);

    return_button =new QPushButton("返回父页面");
    btn_hlayout->addWidget(return_button);

    connect(return_button, &QPushButton::clicked, this, &Page2Window::on_return_btn_clicked);

}

Page2Window::~Page2Window()
{
    delete ui;
}

四、效果图


总结

通过qt5实现了多页面之间的跳转,在此过程中使用了虚函数(c语言没有),看来学习的任务依旧任重而道远。另外,使用此方式进行界面跳转时Page2Window的基类貌似只能使用MainWindow而不能是widget。

相关推荐
老胖闲聊20 分钟前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.11824 分钟前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之1 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?1 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头2 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu2 小时前
java内存模型JMM
java·开发语言
我很好我还能学3 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
蓝婷儿4 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
渣渣盟4 小时前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
糯米导航4 小时前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计