【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;
}
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript