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;
}