qt中父子頁面切換隱藏實現方法 (利用訊號槽機制實現)
阿新 • • 發佈:2022-12-03
首先既然你打開了這篇文章,那你一定想到過,將子介面作為父介面的一個屬性來實現,但是這樣父介面通知子介面會很輕鬆,但子介面通知父介面怎麼搞呢?很顯然不能再子介面再例項化父介面(因為這樣做會迴圈引用),那避免迴圈引用,聰明的你一定想到了使用訊號槽機制來解決這個問題,沒錯,這也是我想到的解決方法。
不過我實際開發遇到的問題比這個好要稍微複雜一點(嘻嘻嘻其實還好了,就是多嵌套了一層)我們先來看圖:
我需要實現的功能呢是這樣的:登入頁面彈出主介面,然後主介面中的某一個子介面可以切換使用者即再切回登入頁面。
那麼我們簡單來理一下這裡面的邏輯關係:
也就是說這是一個簡單的爺套父,父套子的關係,那麼父介面傳遞訊息給子介面很簡單直接例項出來一個子介面就可以了,那麼子介面傳遞給父介面是怎麼做的呢?我這邊以按鈕為例,在子介面中宣告一個訊號,在父介面中將子介面宣告的這個訊號與父介面的槽函式(即處理函式)繫結:
子介面(即維護介面)標頭檔案程式碼:
signals: void maintenanceSignal();
子介面cpp程式碼:
FrmMaintenance::FrmMaintenance(QWidget *parent) : QWidget(parent), ui(new Ui::FrmMaintenance) { ui->setupUi(this); SetChangeUser(); SetLiquidMaintenance(); connect(ui->btnChangeUser,&QPushButton::clicked,this,&FrmMaintenance::btnChangeUserClick); }
void FrmMaintenance::btnChangeUserClick()
{
emit maintenanceSignal();
}
父介面(即主介面)標頭檔案程式碼:
signals: void loginSignal(); private: Ui::MainWindow *ui; // 介面類的物件作為指標 FrmMaintenance *frmMaintenance = new FrmMaintenance();
父介面cpp程式碼:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); SetUi(); SetBottomUi(); connect(ui->btnSampleLoading,&QPushButton::clicked,this,&MainWindow::OpenFrmSampleloading); connect(ui->btnSampleManagement,&QPushButton::clicked,this,&MainWindow::OpenFrmSampleManagement); connect(ui->btnAppStatus,&QPushButton::clicked,this,&MainWindow::OpenFrmAppStatus); connect(ui->btnAlarmInfo,&QPushButton::clicked,this,&MainWindow::OpenFrmAlarmInfo); connect(ui->btnParaSetting,&QPushButton::clicked,this,&MainWindow::OpenFrmParaSetting); connect(ui->btnMaintenance,&QPushButton::clicked,this,&MainWindow::OpenFrmMaintenance); connect(frmMaintenance,&FrmMaintenance::maintenanceSignal,this,&MainWindow::HideWindow); } void MainWindow::HideWindow() { qDebug("QQQ"); emit loginSignal(); }
爺介面(即登入介面)cpp檔案程式碼(標頭檔案就聲明瞭幾個槽函式和一個
MainWindow w;其他就不貼了):
FrmLogin::FrmLogin(QWidget *parent) : QWidget(parent), ui(new Ui::FrmLogin) { ui->setupUi(this); connect(btnLogin,&QPushButton::clicked,this,FrmLogin::btnLoginClick); connect(&w,&MainWindow::loginSignal,this,&FrmLogin::ChangeUser); } void FrmLogin::btnLoginClick() { w.show(); this->hide(); } void FrmLogin::ChangeUser() { this->show(); w.hide(); }
好了,記錄完畢,吃午飯去了~