当前位置: 首页 > news >正文

qt 开发对信号槽进行二次封装,实现信号槽管理接口。

最近做的一个项目,由于工程需要模块之间能够互相通信,但又不想模块之间耦合度太高

使用信号槽的话,需要两个类的对象或者指针在其中一个类都要体现,这样达不到效果,

想要一个管理类对这些互相通信的类之间进行管理,只需要在各自的类注册发送者和接收者即可,双方通过一个指定的消息ID来建立联系。

技术:QObject::connect()定义map来管理发送方和接收方

上代码

头文件

#pragma once

#include "messager_global.h"
#include "GlobalDefines.h"
#include "QObject"
#include "Platform\OSAdapter\VAZLock.h"
#include "Messager.h"

class CMsgObj
{
public:
    CMsgObj(QObject* MsgObj, const tchar* pszMsgObjName, const char* pszMethodName, Qt::ConnectionType connectyType)
    {
        m_MsgObj = MsgObj;
        m_sMsgObjName = pszMsgObjName;
        m_sMethodName = pszMethodName;
        m_connectionType = connectyType;
    };

    QObject* m_MsgObj;
    tstring m_sMsgObjName;
    string    m_sMethodName;
    Qt::ConnectionType m_connectionType;

public:
    inline bool operator == (const CMsgObj& rt) const
    {
        return (rt.m_MsgObj == m_MsgObj)
            && (rt.m_sMethodName == m_sMethodName);
    }
};

class CVAZMessager : public QObject
{
    Q_OBJECT
public:
    CVAZMessager();
    ~CVAZMessager();
    static CVAZMessager& Instance();

    void RegisterReceiver(VAZ_MSG_ID MsgID, QObject* Receiver, const tchar* pszReceiverName, const char* pszMethodName);
    void UnregisterReceiver(VAZ_MSG_ID MsgID, QObject* Receiver, const tchar* pszReceiverName, const char* pszMethodName);

    void RegisterSender(VAZ_MSG_ID MsgID, QObject* Sender, const tchar* pszSenderName, const char* pszMethodName, Qt::ConnectionType connectionType);
    void UnregisterSender(VAZ_MSG_ID MsgID, QObject* Sender, const tchar* pszSenderName, const char* pszMethodName);
    bool IsSignalRegistered(VAZ_MSG_ID MsgID, QObject* Sender);

private:
    map< VAZ_MSG_ID, list< CMsgObj> > m_mapReceivers;
    map< VAZ_MSG_ID, list< CMsgObj> > m_mapSenders;

    typedef map< VAZ_MSG_ID, list< CMsgObj> >::iterator IterReceivers, IterSenders;
    typedef list< CMsgObj>::iterator IterReceiver, IterSender;


    CVAZLock m_MessagerLock;
};


cpp文件

#include "VAZMessager.h"
#include "Platform\Logger\Logger.h"
#include "..\Common\misc.h"

CVAZMessager::CVAZMessager()
    : QObject()
    , m_MessagerLock(_T("Messager Lock"))
{
}

CVAZMessager::~CVAZMessager()
{
}

CVAZMessager & CVAZMessager::Instance()
{
    static CVAZM

相关文章:

qt 开发对信号槽进行二次封装,实现信号槽管理接口。

最近做的一个项目,由于工程需要模块之间能够互相通信,但又不想模块之间耦合度太高 使用信号槽的话,需要两个类的对象或者指针在其中一个类都要体现,这样达不到效果, 想要一个管理类对这些互相通信的类之间进行管理,只需要在各自的类注册发送者和接收者即可,双方通过一…...

本地项目上传到gitee

本地项目通过webstorm上传到gitee 1.登录gitee选择新建仓库 2.输入新建仓库的名字&#xff08;名字与本地项目名一致&#xff09; 3.复制链接 4.找到本地项目&#xff0c;选中地址输入cmd打开命令提示框 5.输入git init初始化git&#xff0c;生成.git文件 6.webstorm中打开项目…...

ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!

在当今数字化办公时代&#xff0c;一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件&#xff0c;凭借其全面的功能、优异的性能和出色的用户体验&#xff0c;为用户带来了超越想象的办公体验。下面&#xff0c;我们将对ON…...

中介子方程三十四

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXK…...

最新Sublime Text软件安装包分享(汉化版本)

Sublime Text 是一款广受欢迎的跨平台文本编辑器&#xff0c;专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称&#xff0c;深受开发者和写作者的喜爱。 一、下载地址 链接&#xff1a;https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…...

AI-智能体基础设施

个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示&#xff0c;即&#xff1a;Agent大模型&#xff08;LLM&#xff09;记忆&#xff08;Memory&#xff09;主动规划&#xff08;Planning&#xff09;工具使用&#xff08;Tool Use&#xff09;。基于该公式&am…...

【docker】docker启动neo4j,并配置内存

注意下&#xff1a;--volume宿主机目录:/data 和 --publish宿主机port:7474 --publish宿主机port:7687 docker run -d \ --publish9801:7474 --publish9802:7687 \ --env NEO4J_AUTHneo4j/passwd \ --volume/opt/docker/data/vol-data/neo4j4.2:/data \ --restart always \ --…...

面试准备记录

6月26日 今日学习 MySQL的1-7题&#xff08;中期报告&#xff0c;加上玩了游戏&#xff0c;就没有认真背题&#xff09; 6月25日 今日复习 JVM的内存管理部分&#xff08;1-31题&#xff09; 6月24日 今日学习 类的生命周期&#xff1f;类加载过程&#xff1f;类加载器有…...

文件管理—linux(基础IO)

目录 ​编辑 一、C语言文件接口&#xff08;库函数&#xff09; hello.c写文件 hello.c读文件 输出信息到显示器 stdin & stdout & stderr 二、系统文件I/O&#xff08;系统调用&#xff09; hello.c 写文件&#xff1a; hello.c读文件 接口介绍 open open…...

【华为OD机试|01】最远足迹(Java/C/Py/JS)

目录 一、题目介绍 1.1 题目描述 1.2 备注&#xff1a; 1.3 输入描述 1.4 输出描述 1.5 用例 二、Java代码实现 2.1 实现思路 2.2 详细代码 2.3 代码讲解&#xff1a; 三、C语言实现 3.1实现步骤 3.2 实现代码 3.3 代码详解 四、Python实现 4.1 实现步骤 4.2 …...

conda安装管理配置

原文链接&#xff1a;conda管理配置 导言 安装卸载 卸载 卸载 docker sudo rm -r /opt/anaconda3 #conda安装位置安装 从镜像archive中下载sh脚本安装 bash ./software/Anaconda3-2024.02-1-Linux-x86_64.sh -b -p /opt/anaconda3 #conda安装位置管理 查看 conda --ver…...

鸿蒙开发HarmonyOS NEXT(一)

最近总听见大家讨论鸿蒙&#xff0c;前端转型的好方向&#xff1f;先入门学习下 目前官方版本和文档持续更新中 一、开发环境 提示&#xff1a;要占用的空间比较多&#xff0c;建议安装在剩余空间多的盘 1、下载&#xff1a;官网最新工具 - 下载中心 - 华为开发者联盟 (huaw…...

新能源革命风起云涌:创新科技引领可持续发展新篇章

随着全球气候变化和环境问题日益严峻&#xff0c;新能源革命正以其不可阻挡的势头&#xff0c;席卷着世界的每一个角落。 创新科技在这场革命中发挥着至关重要的作用&#xff0c;它不仅是新能源开发利用的引擎&#xff0c;更是推动可持续发展的关键力量。 新能源革命的核心在于…...

Java之TimeUnit类

1.TimeUnit类介绍 TimeUnit&#xff08;时间单元&#xff09;是一个描述时间单元的枚举类&#xff0c;在该枚举类中定义有以下的几个时间单元实例&#xff1a;天&#xff08;DAYS&#xff09;、时&#xff08;HOURS&#xff09;、分&#xff08;MINUTES&#xff09;、秒&#…...

【大数据】大数据时代的黎明

目录 前言 深入解读大数据的本质 大数据的起源与演进轨迹 大数据对社会经济的深远影响 经济领域的革新 社会治理与公共服务的智能化 创新体系的重构 面临的挑战与应对 前言 步入21世纪以来&#xff0c;人类文明正站在一个历史性的转折点上&#xff0c;迎来了大数据时代的…...

多接口分线盒在工业自动化中的重要性与应用

简介 多接口分线盒是现代工业自动化中不可或缺的一个组成部分&#xff0c;它主要用于简化复杂的接线系统&#xff0c;提高效率和可靠性。本文将详细探讨多接口分线盒的定义、功能、以及在工业自动化中的应用情况。 无源多接口分线盒 多接口分线盒的定义与功能 多接口分线盒是…...

C# Modbus设备信息加载的实现方式(2)

GlobalProperties是一个全局的数据&#xff0c;类似CoreData&#xff1a; public class GlobalProperties{public static Device Device { set; get; }public static Action<int, string> AddLog;public static SysAdmin CurrentAdmin;public static ModbusTCP Modbus { …...

mongoDB基本命令操作

文章目录 1. 安装(1). 启动mongodb(2). 数据库连接 2. 基本命令(1) 数据库操作(2) 集合操作(3) 文档操作1) 简单查询2) 条件查询3) 投影查询4) 文档更新5) 列值增长修改6) 删除文档7) 分页查询8) 排序查询9) 正则查询(模糊查询)10) 比较查询11) 包含查询 3. 索引(1) 执行计划 1…...

MySQL索引,事务

一.MySQL索引介绍 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据十分大的时候&#xff0c;索引可以大大加快查询的速度。这是因为使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行数…...

嵌入式软件面试记录(5)

1.FreeRTOS使用&#xff0c;是自己移植的吗&#xff0c;移植过程中设置了多少个任务&#xff1f; 答&#xff1a;是自己移植的&#xff0c;从官网下载的包根据手册移植的。 主要涉及以下几个任务&#xff1a; 主任务&#xff1a;负责系统初始化和创建其他任务。创建队列任务点…...

GLM-4.1V-9B-Base模型微调入门:使用accelerate库进行高效参数优化

GLM-4.1V-9B-Base模型微调入门&#xff1a;使用accelerate库进行高效参数优化 1. 引言 想为特定业务场景定制一个强大的多模态AI模型&#xff1f;GLM-4.1V-9B-Base作为支持图文理解与生成的大模型&#xff0c;通过微调可以快速适配各种下游任务。本文将带你从零开始&#xff…...

告别繁琐流程:用快马AI生成脚本实现龙虾部署效率飞跃

最近在团队里负责微服务部署时&#xff0c;发现每次更新代码都要重复执行十几个步骤&#xff1a;拉代码、装依赖、打镜像、推仓库、重启容器...一套流程下来至少半小时&#xff0c;还容易手滑出错。于是研究了一套自动化方案&#xff0c;用Python脚本把整个流程串了起来&#x…...

LeetCode 热题 100(每日两题)-Day2

坚持打卡第二天&#xff01;昨天的哈希表大显神威&#xff0c;今天我们将继续探索哈希集合的妙用&#xff0c;并引入数组操作中极其重要的技巧——双指针&#xff08;快慢指针&#xff09;。一、最长连续序列LeetCode 第 128 题&#xff0c;难度中等。这道题的难点在于题目强制…...

实战应用:为团队部署即装即用的中文版mobaxterm统一环境

在团队协作开发中&#xff0c;统一开发环境配置是个常见痛点。最近我们团队就遇到了这个问题&#xff1a;新成员加入时&#xff0c;每个人都要手动配置MobaXterm的中文界面、服务器连接、工具集等&#xff0c;既费时又容易出错。经过实践摸索&#xff0c;我总结出一套用脚本自动…...

2026进口调节阀品牌选型参考:产品质量与售后响应如何影响实际应用

2026年&#xff0c;进口调节阀在石油化工、电力、制药、冶金和新能源项目中仍有稳定需求。用户在查找进口调节阀品牌或调节阀厂家时&#xff0c;比较关注产品的认证情况、制造基地布局、工况适应能力和服务响应速度。本文整理了一些选型时常见的考虑要点&#xff0c;并介绍美国…...

2026大厂校招笔试指南(高频考点+真实趋势)

关注 霍格沃兹测试学院公众号&#xff0c;回复「资料」&#xff0c;领取人工智能测试开发技术合集很多人现在卡在同一个问题上&#xff1a;题也刷了&#xff0c;时间也花了&#xff0c;但一到笔试还是过不了。你可能也有这种感觉&#xff1a;简单题会做&#xff0c;中等题卡住&…...

从温控器到无人机:PID参数整定的‘手感’秘籍,附C语言代码避坑指南

从温控器到无人机&#xff1a;PID参数整定的‘手感’秘籍与实战避坑指南 在工业自动化和智能硬件开发中&#xff0c;PID控制算法就像一位隐形的调音师&#xff0c;默默调节着系统的每一个细微变化。无论是缓慢升温的工业烘箱&#xff0c;还是高速响应的四旋翼无人机&#xff0c…...

动态卷积在图像分割中的应用与优化策略

1. 动态卷积如何让图像分割更智能 第一次接触动态卷积这个概念时&#xff0c;我正被一个医学图像分割项目困扰。传统卷积神经网络在处理不同组织边界的细微变化时总是力不从心&#xff0c;直到尝试了动态卷积方案&#xff0c;分割精度直接提升了8%。这种"会思考的卷积核&…...

GEE快速入门:哨兵2号影像批量下载与去云处理指南

1. 为什么选择GEE处理哨兵2号影像&#xff1f; 如果你正在寻找一个免费、高效且无需本地高性能计算机的遥感数据处理方案&#xff0c;Google Earth Engine&#xff08;GEE&#xff09;绝对是你的首选。作为一个云端地理空间分析平台&#xff0c;GEE存储了海量的卫星影像数据&am…...

收藏!小白程序员必看:Agent和工作流是最佳拍档,教你如何协同它们(附案例)

文章探讨了AI智能体&#xff08;Agent&#xff09;和工作流工具的关系&#xff0c;指出它们并非竞争对手&#xff0c;而是最佳拍档。Agent擅长自主决策和动态规划&#xff0c;适用于探索性和不确定性任务&#xff1b;工作流则负责流程编排和确定性执行&#xff0c;适用于重复性…...