【Qt之信号和槽】对象多层嵌套后,高效使用信号和槽

news/2024/10/23 5:49:45/

抛出问题

Qt的信号槽机制非常牛逼,也是Qt的独特的核心功能之一。
有时候在很多窗体中传递信号来实现更新或者处理,如果窗体层级比较多,比如窗体A的父类是窗体B,窗体B的父类是窗体C,窗体C有个子窗体D,如果窗体A一个信号要传递给窗体D,问题来了,必须先经过窗体B中转到窗体C再到窗体D才行,这样的话各种信号关联信号的connect会非常多而且管理起来比较乱

解决方案

可以考虑增加一个全局的单例类AppEvent,公共的信号放这里,然后窗体A对应信号绑定到AppEvent,窗体D绑定AppEvent的信号到对应的槽函数即可,干净清爽整洁。

示例

下面是一个简单的C++示例代码,使用全局单例类来实现在窗体层级比较多的情况下传递信号:

#include <QObject>// 定义一个全局单例类
class AppEvent : public QObject
{Q_OBJECT
public:static AppEvent* instance(){static AppEvent instance; // 构造函数为私有,只能通过静态成员函数创建实例return &instance;}signals:// 定义公共信号void signalToBeTransmitted(int value);
};// 窗体D
class WindowD : public QObject
{Q_OBJECT
public slots:// 槽函数,处理信号void handleSignalFromAppEvent(int value){// 处理信号}
};// 窗体A
class WindowA : public QObject
{Q_OBJECT
public:WindowA(){// 将窗体A的信号连接到全局的AppEvent的信号上connect(this, &WindowA::signalFromWindowA, AppEvent::instance(), &AppEvent::signalToBeTransmitted);}signals:// 定义窗体A的信号void signalFromWindowA(int value);
};// 窗体B
class WindowB : public QObject
{Q_OBJECT
public:WindowB(){// 将AppEvent的信号连接到窗体B的槽函数上connect(AppEvent::instance(), &AppEvent::signalToBeTransmitted, this, &WindowB::handleSignalFromAppEvent);}public slots:// 窗体B的槽函数,处理信号void handleSignalFromAppEvent(int value){// 处理信号}
};// 窗体C
class WindowC : public QObject
{Q_OBJECT
public:WindowC(){// 将AppEvent的信号连接到窗体C的槽函数上connect(AppEvent::instance(), &AppEvent::signalToBeTransmitted, this, &WindowC::handleSignalFromAppEvent);}public slots:// 窗体C的槽函数,处理信号void handleSignalFromAppEvent(int value){// 处理信号}
};int main()
{// 创建窗体层级关系WindowD windowD;WindowC windowC;WindowB windowB;WindowA windowA;// 发射窗体A的信号emit windowA.signalFromWindowA(42);return 0;
}

思路

  • 定义了一个全局的单例类AppEvent,其中定义了一个公共信号signalToBeTransmitted
  • 窗体A的信号signalFromWindowA连接到了AppEvent的信号signalToBeTransmitted上,
  • 窗体D的槽函数handleSignalFromAppEvent则连接到了AppEvent的信号上,以处理信号。

结论

使用全局单例类AppEvent可以简化信号的传递过程,使代码更加整洁和可维护。


http://www.ppmy.cn/news/1147911.html

相关文章

leetcode35. Search Insert Position

文章目录 一、题目二、题解 一、题目 Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You must write an algorithm with O(log n) r…

微信小程序 在bindscroll事件中监听scroll-view滚动到底

scroll-view其实提供了一个 bindscrolltolower 事件 这个事件的作用是直接监听scroll-view滚动到底部 但是 总有不太一样的情况 公司的项目 scroll-view 内部 最下面有一个 类名叫 bottombj 的元素 我希望 滚动到这个 bottombj 上面的时候就开始加载滚动分页 简单说 bottombj这…

3、TCP状态

TCP状态 1、TCP通信时序 三次握手成功后&#xff0c;服务器和客户端进入了状态ESTABLISHED 当处于Time_WAIT状态后&#xff0c;不会马上变成CLOSE状态&#xff0c;会经历2MSL&#xff08;约40秒&#xff09;&#xff0c;之后才会进入CLOSE状态。 总结&#xff1a; 主动发起…

04_学习springdoc与oauth结合_简述

文章目录 1 前言2 基本结构3 需要做的配置 简述4 需要做的配置 详述4.1 backend-api-gateway 的配置4.1.1 application.yml 4.2 backend-film 的配置4.2.1 pom.xml 引入依赖4.2.2 application.yml 的配置4.2.3 Spring Security 资源服务器的配置类 MyResourceServerConfig4.2.4…

获取操作系统信息服务器信息JVM信息cpu内存磁盘信息

1.添加依赖 <dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>5.6.0</version> </dependency>

贪心+分类讨论完整性:ARC123C

https://www.luogu.com.cn/problem/AT_arc123_c 场上就简单猜了个结论&#xff0c;[1,3]>1, [4,6]>2, [7,9]>3&#xff0c;0>4&#xff0c;若存在1则此时必须为1个数&#xff0c;否则为4。存在2则必须<2&#xff0c;否则为4. 但我没对4进行完整讨论。如果4个数…

【Java学习之道】继承与多态

引言 本文将介绍面向对象编程的核心概念——继承与多态。对于初学者来说&#xff0c;掌握这些基本概念是迈向Java高手的第一步。接下来&#xff0c;让我们一起揭开继承与多态的神秘面纱&#xff0c;感受它们的魅力吧&#xff01; 一、继承 继承是面向对象编程的一个重要特性…

《RISC-V体系结构编程与实践》的benos_payload程序——mysbi跳转到benos分析

1、benos_payload.bin结构分析 韦东山老师提供的开发文档里已经对程序的结构做了分析&#xff0c;这里不再赘述&#xff0c;下面是讨论mysbi跳转到benos的问题&#xff1b; 2、mysbi跳转到benos的代码 3、跳转产生的疑问 我认为mysbi.bin最后跳转到0x22000地址处执行&#xff0…