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_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_OBJECTpublic: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;
}