当前位置:   article > 正文

QT5:多窗口跳转

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:

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QPushButton>
  5. #include <QHBoxLayout>
  6. #include "page1window.h"
  7. #include "page2window.h"
  8. QT_BEGIN_NAMESPACE
  9. namespace Ui { class MainWindow; }
  10. QT_END_NAMESPACE
  11. class MainWindow : public QMainWindow
  12. {
  13. Q_OBJECT
  14. public:
  15. MainWindow(QWidget *parent = nullptr);
  16. ~MainWindow();
  17. private slots:
  18. void on_page1_button_clicked();
  19. void on_page2_button_clicked();
  20. private:
  21. Ui::MainWindow *ui;
  22. Page1Window *page1=NULL;
  23. Page2Window *page2=NULL;
  24. QPushButton *page1_button=NULL;
  25. QPushButton *page2_button=NULL;
  26. QHBoxLayout *btn_hlayout; //水平布局
  27. };
  28. #endif // MAINWINDOW_H

 mainwindow.cpp:

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent)
  4. : QMainWindow(parent)
  5. , ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. QWidget *widget=new QWidget(this);
  9. this->setCentralWidget(widget); // 设置为中心部件
  10. btn_hlayout = new QHBoxLayout(widget);
  11. page1=new Page1Window(this);
  12. page1_button =new QPushButton("前往页面一");
  13. page2_button =new QPushButton("前往页面二");
  14. btn_hlayout->addWidget(page1_button);
  15. btn_hlayout->addWidget(page2_button);
  16. // 跳转到子窗口
  17. connect(page1_button, &QPushButton::clicked, this, &MainWindow::on_page1_button_clicked);
  18. //接收返回信号显示当前窗口
  19. connect(page1,&Page1Window::goback,this,[=](){page1->close();this->show();});
  20. Page2Window *Page2FrommMin = new class Page2FromMain(this); // 使用匿名内部类
  21. connect(page2_button, &QPushButton::clicked, this, [=]() {Page2FrommMin->show();this->hide();});
  22. }
  23. MainWindow::~MainWindow()
  24. {
  25. delete ui;
  26. }
  27. void MainWindow::on_page1_button_clicked()
  28. {
  29. this->hide();
  30. page1->show();
  31. }
  32. void MainWindow::on_page2_button_clicked()
  33. {
  34. this->hide();
  35. page2->show();
  36. }

 pgge1window.h:

  1. #ifndef PAGE1WINDOW_H
  2. #define PAGE1WINDOW_H
  3. #include <QMainWindow>
  4. #include <QPushButton>
  5. #include <QHBoxLayout>
  6. namespace Ui {
  7. class Page1Window;
  8. }
  9. class Page1Window : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit Page1Window(QWidget *parent = nullptr);
  14. ~Page1Window();
  15. signals:
  16. void goback();
  17. private slots:
  18. void on_return_btn_clicked();
  19. private:
  20. Ui::Page1Window *ui;
  21. QPushButton *return_button=NULL;
  22. QPushButton *page2_button=NULL;
  23. QHBoxLayout *btn_hlayout; //水平布局
  24. };
  25. #endif // PAGE1WINDOW_H

pgge1window.cpp:

  1. #include "page1window.h"
  2. #include "ui_page1window.h"
  3. #include "page2window.h"
  4. Page1Window::Page1Window(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::Page1Window)
  7. {
  8. ui->setupUi(this);
  9. QWidget *widget=new QWidget(this);
  10. this->setCentralWidget(widget); // 设置为中心部件
  11. btn_hlayout = new QHBoxLayout(widget);
  12. return_button =new QPushButton("返回主页面");
  13. page2_button =new QPushButton("前往页面二");
  14. btn_hlayout->addWidget(return_button);
  15. btn_hlayout->addWidget(page2_button);
  16. connect(return_button, &QPushButton::clicked, this, &Page1Window::on_return_btn_clicked);
  17. Page2Window *Page2FrommPage1 = new class Page2FromPage1(this); // 使用匿名内部类
  18. connect(page2_button, &QPushButton::clicked, this, [=]() {Page2FrommPage1->show();this->hide();});
  19. }
  20. Page1Window::~Page1Window()
  21. {
  22. delete ui;
  23. }
  24. void Page1Window::on_return_btn_clicked()
  25. {
  26. emit goback();
  27. }

 pgge2window.h: 

  1. #ifndef PAGE2WINDOW_H
  2. #define PAGE2WINDOW_H
  3. #include <QMainWindow>
  4. #include <QPushButton>
  5. #include <QHBoxLayout>
  6. namespace Ui {
  7. class Page2Window;
  8. }
  9. class Page2Window : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit Page2Window(QWidget *parent = nullptr);
  14. ~Page2Window();
  15. virtual void on_return_btn_clicked() = 0; // 纯虚函数,需要在子类中实现
  16. private:
  17. Ui::Page2Window *ui;
  18. QWidget *Widget;
  19. QPushButton *return_button;
  20. QHBoxLayout *btn_hlayout; //水平布局
  21. };
  22. //页面二(从主页面跳转)
  23. class Page2FromMain : public Page2Window {
  24. QWidget *parentWindow1;
  25. public:
  26. Page2FromMain(QWidget *parent = nullptr) : Page2Window(parent), parentWindow1(parent) {
  27. }
  28. void on_return_btn_clicked() override {
  29. parentWindow1->show();
  30. this->hide();
  31. }
  32. };
  33. //页面二(从页面一跳转)
  34. class Page2FromPage1 : public Page2Window {
  35. QWidget *parentWindow2;
  36. public:
  37. Page2FromPage1(QWidget *parent = nullptr) : Page2Window(parent), parentWindow2(parent) {
  38. }
  39. void on_return_btn_clicked() override {
  40. parentWindow2->show();
  41. this->hide();
  42. }
  43. };
  44. #endif // PAGE2WINDOW_H

  pgge2window.cpp: 

  1. #include "page2window.h"
  2. #include "ui_page2window.h"
  3. Page2Window::Page2Window(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::Page2Window)
  6. {
  7. ui->setupUi(this);
  8. QWidget *widget=new QWidget(this);
  9. this->setCentralWidget(widget); // 设置为中心部件
  10. btn_hlayout = new QHBoxLayout(widget);
  11. return_button =new QPushButton("返回父页面");
  12. btn_hlayout->addWidget(return_button);
  13. connect(return_button, &QPushButton::clicked, this, &Page2Window::on_return_btn_clicked);
  14. }
  15. Page2Window::~Page2Window()
  16. {
  17. delete ui;
  18. }

四、效果图

 


 总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/865447
推荐阅读
相关标签
  

闽ICP备14008679号