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();
}
好了,记录完毕,吃午饭去了~
Qt中父子页面切换隐藏实现方法 (利用信号槽机制实现)的更多相关文章
- [转]Qt中定时器使用的两种方法
Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...
- Qt开发之信号槽机制
一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...
- QT源码之Qt信号槽机制与事件机制的联系
QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...
- Qt 学习之路 2(4):信号槽
Home / Qt 学习之路 2 / Qt 学习之路 2(4):信号槽 Qt 学习之路 2(4):信号槽 豆子 2012年8月23日 Qt 学习之路 2 110条评论 信号槽是 Qt 框架引以 ...
- Q_OBJECT提供了信号槽机制、国际化机、RTTI 的反射能力(cpp中使用Q_OBJECT导致无法处理moc,就需要#include “moc_xxx.h”)
只有继承了QObject类的类,才具有信号槽的能力.所以,为了使用信号槽,必须继承QObject.凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT.不管是不 ...
- QT信号槽机制
信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...
- VJGUI消息设计-兼谈MFC、QT和信号/槽机制
星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...
- Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)
一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...
- QT写hello world 以及信号槽机制
QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...
- 非Qt工程使用Qt的信号槽机制
非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All ...
随机推荐
- angular 父组件调用子组件方法---以及组件跨模块使用方法
如果要在父组件调用子组件 可以这样子 @ViewChild('mySun', { static: false }) mySun: MySunComponent; 使用方法: let res=this. ...
- 支付对接常用的加密方式介绍以及java代码实现
京东科技 姚永健 一.术语表: 1.对称算法 加密解密密钥是相同的.这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥.对称算法的安全性依赖于密钥,泄漏密钥就意味着 ...
- 连接KingbaseES异常,致命错误/ 用户"system" Password 认证失败(kbjdbc/autodetected server-encoding to be GB2312...)
com.kingbase8.util.KSQLException: 致命错误: 用户"system" Password 认证失败(kbjdbc:autodetected serve ...
- saas架构之druid解析表名
public void preHandle(BoundSql boundSql, RequestEntity requestEntity) { System.out.println("要执行 ...
- python学习第一周总结
第一周内容概要 day01 typora软件安装 markdown语法 typora软件功能介绍 网络博文编写教程 计算机的本质 计算机的五大组成部分 计算机的三大核心硬件 day02 操作系统 编程 ...
- C#NPOI操作Excel,实现Excel数据导入导出(支持多个sheet)
首先在项目中引用NPOI,通过管理NuGet程序包,搜索NPOI,选择版本2.3.0(支持.NET Framework 4.0)根据自己项目选择适当版本. 1.NpoiExcelHelper.cs ...
- CentOS安装mysql、MariaDB以及更改数据库存储路径
注意:此方法只适用于新的机器或没有重要数据库表(可随意删除)的机器安装,如需升级版本参考下方链接!!! https://www.jianshu.com/p/955ff6065935 一.安装操作 1. ...
- 视觉十四讲:第七讲_ORB特征点
1.特征点 特征点是图像里一些特别的地方,如角点.边缘和区块.比较著名有SIFT.SURF.ORB等.SIFT充分考虑了图像变换过程中出现的光照.尺度.旋转等变换,但是计算量非常大.而ORB是质量和性 ...
- Jetson Nano更改软件源
Jetson Nano 采用的是 aarch64 架构的Ubuntu 18.04.2 LTS 系统 sudo vim /etc/apt/sources.list deb http://mirrors. ...
- 三:Mybatis
三.MyBatis 主流的ORM 支持java .NET Ruby三种语言,MyBatis是对JDBC的封装 ORM框架Hibernate 区别: 1)sql 优化方面 Hibernate 使用 HQ ...