当前位置: 首页 > news >正文

【QT】QT的多界面跳转以及界面之间传递参数

QT的多界面跳转以及界面之间传递参数

  • 一、在QT工程中添加新的界面
  • 二、多界面跳转的两种情况
    • 1、A界面跳到B界面,不需要返回
    • 2、A界面跳到B界面,需要返回
      • 1)使用this指针传递将当前界面地址传递给下一界面
      • 2)使用parentWidget函数获取上一级窗口的指针
      • 示例代码:
  • 三、界面之间传递参数(本质上是类跟类之间传递信息)
    • 1、B界面的类中定义了一个公有的方法,通过调用这个公有方法把参数传递过去
    • 2、通过自定义信号来传递参数(发送信号,信号带参数)

一、在QT工程中添加新的界面

右键点击工程名–》选择添加新文件–》QT–》QT设计师界面类–》模板选择MainWindow
详细步骤如下:
1、
在这里插入图片描述
2、
在这里插入图片描述
3、
在这里插入图片描述
4、
在这里插入图片描述
5、
在这里插入图片描述

二、多界面跳转的两种情况

1、A界面跳到B界面,不需要返回

//创建主界面对象
MainWindow *newwin=new MainWindow(); //堆空间
//把主界面显示出来
newwin->show();
//把登录界面关闭 ,与需要返回的差别
this->close();

2、A界面跳到B界面,需要返回

1)使用this指针传递将当前界面地址传递给下一界面

// 创建主界面对象
MainWindow *newwin=new MainWindow(this); //此时必须传递this,原因是返回的时候需要根据这个this找到上一级窗口的地址
qDebug()<<"登录界面的首地址是: "<<this;
//把主界面显示出来
newwin->show();
//把登录界面隐藏--》把登录界面转入系统后台运行
this->hide();

2)使用parentWidget函数获取上一级窗口的指针

QWidget *QWidget::parentWidget() const  
    返回值:返回上一级窗口的指针
       原理:当初你跳到下一个界面的时候必须把当前界面的地址传递给下一个界面

示例代码:

// 第二个界面:info_win.cpp
#include "info_win.h"
#include "ui_info_win.h"
#include <QDebug>
#include <QWidget>

info_win::info_win(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::info_win)
{
    ui->setupUi(this);
    save_mainwin = parent;
    qDebug()<<"传递过来的参数是第一个界面的地址:"<<parent;
}

info_win::~info_win()
{
    delete ui;
}
//返回上一级界面按钮的槽函数(第一个界面,登录界面)
void info_win::on_btn_back_clicked()
{
    //得到上一级界面的地址
    //思路1:当初创建第二个界面的时候,把第一个界面的地址通过构造函数传递过来
    //      定义的私有成员save_mainwin就是用来保存传递过来的第一个界面的地址
    // 显示上级界面
//    save_mainwin->show();

    //思路2:QT提供了一个函数,叫做parentWidget(),该函数用来返回上一级界面地址
    QWidget *main_win = this->parentWidget();
    main_win->show();
    qDebug()<<"main_win界面地址:"<<main_win;

    //关闭当前(第二个界面)界面
    delete this;    // this->close();
}

// info_win.h
#ifndef INFO_WIN_H
#define INFO_WIN_H

#include <QMainWindow>

namespace Ui {
class info_win;
}

class info_win : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_btn_back_clicked();

private:
    Ui::info_win *ui;
    QWidget *save_mainwin;
};

#endif // INFO_WIN_H

三、界面之间传递参数(本质上是类跟类之间传递信息)

A界面传递参数给B界面(A是第一个界面,B是第二个界面)

1、B界面的类中定义了一个公有的方法,通过调用这个公有方法把参数传递过去

// A界面

// 第一个界面:
 // mainwindow.h
 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

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_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "info_win.h"
#include <QString>
#include <QDebug>

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

MainWindow::~MainWindow()
{
    delete ui;
}
// 登录按钮的槽函数
void MainWindow::on_pushButton_clicked()
{
    // 获取输入的用户名和密码
    QString account = ui->lineEdit->text();
    QString pswd = ui->lineEdit_2->text();

    if(account == "aaa" && pswd == "123")
    {
        //创建第二个界面对象,必须传递this指针(把第一个界面的地址传给第二个界面)
        info_win *info_w = new info_win(this);
        // 将第一个界面的账号和密码传递给第二个界面
        info_w->getMsg(account, pswd);
        qDebug()<<"第一界面的地址是"<<this;
        // 显示第二个界面
        info_w->show();
        //隐藏第一个界面
        /*
            隐藏:把界面转入到系统后台运行,这个界面对象依然存在
            关闭:界面释放掉,对象不存在了
        */
        this->hide();
    }
    else
    {
        qDebug()<<"账号或密码错误,重新输入";
    }
}

// B 界面

// 第二个界面
// info_win.h
#ifndef INFO_WIN_H
#define INFO_WIN_H

#include <QMainWindow>

namespace Ui {
class info_win;
}

class info_win : public QMainWindow
{
    Q_OBJECT

public:
    explicit info_win(QWidget *parent = nullptr);
    ~info_win();
    void getMsg(QString account, QString pswd);

private slots:
    void on_btn_back_clicked();

private:
    Ui::info_win *ui;
    QWidget *save_mainwin;
    QString main_account;
    QString main_pswd;
};

#endif // INFO_WIN_H

// info_win.cpp
#include "info_win.h"
#include "ui_info_win.h"
#include <QDebug>
#include <QWidget>

info_win::info_win(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::info_win)
{
    ui->setupUi(this);
    save_mainwin = parent;
    qDebug()<<"传递过来的参数是第一个界面的地址:"<<parent;
}

info_win::~info_win()
{
    delete ui;
}
// 获取第一个界面的账号和密码
void info_win::getMsg(QString account, QString pswd)
{
    main_account = account;
    main_pswd = pswd;
    qDebug()<<"第一个界面传递过来的账号和密码:"<<main_account<<"  "<<main_pswd;
}
//返回上一级界面按钮的槽函数(第一个界面,登录界面)
void info_win::on_btn_back_clicked()
{
    //得到上一级界面的地址
    //思路1:当初创建第二个界面的时候,把第一个界面的地址通过构造函数传递过来
    //      定义的私有成员save_mainwin就是用来保存传递过来的第一个界面的地址
    // 显示上级界面
//    save_mainwin->show();

    //思路2:QT提供了一个函数,叫做parentWidget(),该函数用来返回上一级界面地址
    QWidget *main_win = this->parentWidget();
    main_win->show();
    qDebug()<<"main_win界面地址:"<<main_win;

    //关闭当前(第二个界面)界面
    delete this;    // this->close();
}

2、通过自定义信号来传递参数(发送信号,信号带参数)

// 第一个界面:
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

signals: //自定义信号
    void sendSign(QString, QString);

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "info_win.h"
#include <QString>
#include <QDebug>

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

MainWindow::~MainWindow()
{
    delete ui;
}
// 登录按钮的槽函数
void MainWindow::on_pushButton_clicked()
{
    // 获取输入的用户名和密码
    QString account = ui->lineEdit->text();
    QString pswd = ui->lineEdit_2->text();

    if(account == "aaa" && pswd == "123")
    {
        //创建第二个界面对象,必须传递this指针(把第一个界面的地址传给第二个界面)
        info_win *info_w = new info_win(this);
        // 将第一个界面的账号和密码传递给第二个界面 --信号发送
        connect(this, SIGNAL(sendSign(QString, QString)), info_w, SLOT(recvSlot(QString, QString)));
        emit sendSign(account, pswd);
        qDebug()<<"第一界面的地址是"<<this;
        // 显示第二个界面
        info_w->show();
        this->hide();
    }
    else
    {
        qDebug()<<"账号或密码错误,重新输入";
    }
}
// 第二个界面:
// info_win.h
#ifndef INFO_WIN_H
#define INFO_WIN_H

#include <QMainWindow>

namespace Ui {
class info_win;
}

class info_win : public QMainWindow
{
    Q_OBJECT

public:
    explicit info_win(QWidget *parent = nullptr);
    ~info_win();
    //void getMsg(QString account, QString pswd);

private slots:
    void on_btn_back_clicked();
    void recvSlot(QString account, QString pswd);

private:
    Ui::info_win *ui;
    QWidget *save_mainwin;
    QString main_account;
    QString main_pswd;
};

#endif // INFO_WIN_H

// info_win.cpp
#include "info_win.h"
#include "ui_info_win.h"
#include <QDebug>
#include <QWidget>

info_win::info_win(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::info_win)
{
    ui->setupUi(this);
    save_mainwin = parent;
    qDebug()<<"传递过来的参数是第一个界面的地址:"<<parent;
}

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

//返回上一级界面按钮的槽函数(第一个界面,登录界面)
void info_win::on_btn_back_clicked()
{
    //得到上一级界面的地址
    //思路1:当初创建第二个界面的时候,把第一个界面的地址通过构造函数传递过来
    //      定义的私有成员save_mainwin就是用来保存传递过来的第一个界面的地址
    // 显示上级界面
//    save_mainwin->show();

    //思路2:QT提供了一个函数,叫做parentWidget(),该函数用来返回上一级界面地址
    QWidget *main_win = this->parentWidget();
    main_win->show();
    qDebug()<<"main_win界面地址:"<<main_win;

    //关闭当前(第二个界面)界面
    delete this;    // this->close();
}

void info_win::recvSlot(QString account, QString pswd)
{
    qDebug()<<"通过信号传递过来的参数"<<account<<"  "<<pswd;
}


相关文章:

  • 【超详细】一文解决更新小米澎湃2.0后LSPose失效问题
  • 使用 Less 实现 PC 和移动端样式适配
  • Java基础-27-多态-多态好处和存在的问题
  • win server2022 限制共享文件夹d
  • PWA 进阶教程(二): 如何在 PWA 中实现推送通知
  • Linux系统调用编程
  • LeetCode102.二叉树的层序遍历
  • 【操作系统】Linux进程管理和调试
  • QML Book 学习基础6(定位/布局元素)
  • 【浏览器的渲染原理】
  • uniapp微信小程序开发工具本地获取指定页面二维码
  • 【AI工具】DeepSeek直接生成图片,效果不错
  • 前后端数据序列化:从数组到字符串的旅程(附优化指南)
  • 爬虫:请求头,requests库基本使用
  • 《C++Linux编程进阶:从0实现muduo 》-第8讲.C++面试如何高效获取线程ID
  • nginx如何重启
  • 物联网时代,HMI 设计的创新机遇与挑战
  • 人工智能的三个主义(行为主义、连结主义、符号主义)的整体性关系(并非割裂)
  • MySQL注入中user-agent和cookie存在的注入
  • OpenCV 从入门到精通(day_03)
  • 2025年上海科技节开幕,人形机器人首次登上科学红毯
  • 林诗栋/蒯曼混双取胜,国乒赢得多哈世乒赛开门红
  • 流失海外79年,两卷战国帛书回归祖国
  • 又一例!易方达基金张坤卸任副总职务,将专注于投资管理工作
  • 俄乌代表团抵达谈判会场
  • 关税互降后的外贸企业:之前暂停的订单加紧发货,后续订单考验沟通谈判能力