首先既然你打开了这篇文章,那你一定想到过,将子界面作为父界面的一个属性来实现,但是这样父界面通知子界面会很轻松,但子界面通知父界面怎么搞呢?很显然不能再子界面再实例化父界面(因为这样做会循环引用),那避免循环引用,聪明的你一定想到了使用信号槽机制来解决这个问题,没错,这也是我想到的解决方法。

不过我实际开发遇到的问题比这个好要稍微复杂一点(嘻嘻嘻其实还好了,就是多嵌套了一层)我们先来看图:

我需要实现的功能呢是这样的:登录页面弹出主界面,然后主界面中的某一个子界面可以切换用户即再切回登录页面。

那么我们简单来理一下这里面的逻辑关系:

也就是说这是一个简单的爷套父,父套子的关系,那么父界面传递消息给子界面很简单直接实例出来一个子界面就可以了,那么子界面传递给父界面是怎么做的呢?我这边以按钮为例,在子界面中声明一个信号,在父界面中将子界面声明的这个信号与父界面的槽函数(即处理函数)绑定:

子界面(即维护界面)头文件代码:

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

好了,记录完毕,吃午饭去了~

Qt中父子页面切换隐藏实现方法 (利用信号槽机制实现)的更多相关文章

  1. [转]Qt中定时器使用的两种方法

    Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...

  2. Qt开发之信号槽机制

    一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...

  3. QT源码之Qt信号槽机制与事件机制的联系

    QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...

  4. Qt 学习之路 2(4):信号槽

    Home / Qt 学习之路 2 / Qt 学习之路 2(4):信号槽 Qt 学习之路 2(4):信号槽  豆子  2012年8月23日  Qt 学习之路 2  110条评论 信号槽是 Qt 框架引以 ...

  5. Q_OBJECT提供了信号槽机制、国际化机、RTTI 的反射能力(cpp中使用Q_OBJECT导致无法处理moc,就需要#include “moc_xxx.h”)

     只有继承了QObject类的类,才具有信号槽的能力.所以,为了使用信号槽,必须继承QObject.凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT.不管是不 ...

  6. QT信号槽机制

    信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...

  7. VJGUI消息设计-兼谈MFC、QT和信号/槽机制

    星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...

  8. Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

    一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...

  9. QT写hello world 以及信号槽机制

    QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...

  10. 非Qt工程使用Qt的信号槽机制

    非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All ...

随机推荐

  1. JavaScript 浅拷贝和深拷贝

    JavaScript 中的拷贝分为两种:浅拷贝和深拷贝. 一.浅拷贝 浅拷贝是指在拷贝过程中,只拷贝一个对象中的指针,而不拷贝实际的数据.所以,浅拷贝中修改新对象中的数据时,原对象中的数据也会被改变. ...

  2. Coolify系列-解决WARNING: IPv4 forwarding is disabled. Networking will not work.以及开启防火墙端口

    背景 我在windows电脑安装了一个VM,使用VM开启了Linux服务器,运行docker,然后遇到了这个报错. 解决 首先:在宿主机上执行 echo "net.ipv4.ip_forwa ...

  3. Angularjs的重要概念

    AngularJS的重要概念 MVC模式 AngularJS最早按照MVC模式设计,在这种设计模式下,AngularJS组件可以分为: M: Model,即模型,是应用程序中用于处理应用程序数据逻辑的 ...

  4. Anaconda和pip常用命令汇总:简单,通俗易懂

    前言 在学习 anaconda 的常用命令之前要先安装好 Anaconda for Windows,Anaconda for Ubuntu,这里我总结了 Windows 环境下和 Ubuntu 环境下 ...

  5. Pytest插件pytest-rerunfailures失败重跑

    Pytest插件pytest-rerunfailures失败重跑 安装 pip install pytest-rerunfailures doc https://github.com/pytest-d ...

  6. 基于昇腾计算语言AscendCL开发AI推理应用

    摘要:本文介绍了昇腾计算语言AscendCL的基本概念,并以示例代码的形式介绍了如何基于AscendCL开发AI推理应用,最后配以实际的操作演示说明如何编译运行应用. 本文分享自华为云社区<基于 ...

  7. OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析

    OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍在 OpenMP 当中 guided 调度方式的实现原理.这个调度方式其实和 dy ...

  8. 学习Java Day6

    今天学习了Java的输出,与C/C++不同,Java的输出形式有很多,有许多printf标识符表示的含义各不相同,而且数量众多,其中Java还有表示日期的转换符.

  9. 字符串、函数、bug

    字符串 字符串驻留机制 仅保存一份相同且不可变字符串的方法,不同的值别存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续穿件相同的字符串时,不会开辟新的空间,而是把字符串 ...

  10. python 中常用可视化工具库

    python 中常用可视化工具库 a.Numpy常用属性及方法 为什么用它:它可以方便的使用数组,矩阵进行计算,包含线性代数.傅里叶变换.随机数生成等大量函数(处理数值型的数组) import num ...