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

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

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

右键点击工程名--》选择添加新文件--》QT--》QT设计师界面类--》模板选择MainWindow
详细步骤如下:

1、

2、

3、

4、

5、

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

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

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

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

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

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

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

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

示例代码:

cpp 复制代码
// 第二个界面: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界面

cpp 复制代码
// 第一个界面:
 // 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 界面

cpp 复制代码
// 第二个界面
// 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、通过自定义信号来传递参数(发送信号,信号带参数)

cpp 复制代码
// 第一个界面:
//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()<<"账号或密码错误,重新输入";
    }
}
cpp 复制代码
// 第二个界面:
// 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;
}
相关推荐
车载小杜1 小时前
基于指针的线程池
开发语言·c++
沐知全栈开发1 小时前
Servlet 点击计数器
开发语言
m0Java门徒1 小时前
Java 递归全解析:从原理到优化的实战指南
java·开发语言
桃子酱紫君2 小时前
华为配置篇-BGP实验
开发语言·华为·php
QTX187302 小时前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
shaoing2 小时前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
The Future is mine3 小时前
Python计算经纬度两点之间距离
开发语言·python
Enti7c3 小时前
HTML5和CSS3的一些特性
开发语言·css3
AAA废品回收站陈师傅3 小时前
19信号和槽_信号和槽的基本概念
qt
爱吃巧克力的程序媛3 小时前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt