Qt中父子页面切换隐藏实现方法 (利用信号槽机制实现)
首先既然你打开了这篇文章,那你一定想到过,将子界面作为父界面的一个属性来实现,但是这样父界面通知子界面会很轻松,但子界面通知父界面怎么搞呢?很显然不能再子界面再实例化父界面(因为这样做会循环引用),那避免循环引用,聪明的你一定想到了使用信号槽机制来解决这个问题,没错,这也是我想到的解决方法。
不过我实际开发遇到的问题比这个好要稍微复杂一点(嘻嘻嘻其实还好了,就是多嵌套了一层)我们先来看图:
我需要实现的功能呢是这样的:登录页面弹出主界面,然后主界面中的某一个子界面可以切换用户即再切回登录页面。
那么我们简单来理一下这里面的逻辑关系:
也就是说这是一个简单的爷套父,父套子的关系,那么父界面传递消息给子界面很简单直接实例出来一个子界面就可以了,那么子界面传递给父界面是怎么做的呢?我这边以按钮为例,在子界面中声明一个信号,在父界面中将子界面声明的这个信号与父界面的槽函数(即处理函数)绑定:
子界面(即维护界面)头文件代码:
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(); }
好了,记录完毕,吃午饭去了~