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

C++,观察者模式,模拟Qt的信号和槽机制

运行在VS2022,x86,Debug下

33. 模拟Qt信号和槽机制

  • 信号与槽实现原理:观察者模式,即当一个对象被修改时,就会自动通知依赖它的对象。
  • 应用:对象间的通信。
  • Qt实现信号与槽,代码如下。
#include <QObject>//发送者
class Sender : public QObject 
{Q_OBJECT  //必须在类声明中包含这个宏public:signals: void signal();  //声明信号void sendSignal()  //发射信号{emit signal(); //通过emit关键字发射信号}
};// 接收者
class Receiver : public QObject 
{Q_OBJECTpublic slots:void handleSignal() // 槽函数,处理信号{qDebug() << "Signal received";}
};int main() {Sender sender;Receiver receiver;// 将信号与槽连接起来QObject::connect(&sender, &Sender::signal, &receiver, &Receiver::handleSignal);// 发射信号sender.sendSignal();return 0;
}
  • C++模拟实现信号与槽,代码如下。
    通过将函数指针传递给另一个函数,该函数可以在需要时通过该指针调用相应的函数,实现回调的效果。
using SlotType = void(*)(void*); //定义槽函数指针类型,参数是void*,接收任意类型的数据// 发送者
class Sender 
{
private:vector<SlotType> slots;       //槽函数列表public:void connect(SlotType slot)   //连接信号与槽{ slots.emplace_back(slot); //将槽函数指针添加到槽列表中}void sendSignal(void* data)  //发射信号{for (auto&& slot : slots)slot(data);     //调用所有已连接的槽函数} 
};// 接收者
class Receiver 
{
public:static void handleSignal(void* data)  //槽函数,处理信号{cout << "Signal received: " << *static_cast<int*>(data) << endl; }
};int main() {Sender sender;//将信号与槽连接起来sender.connect(&Receiver::handleSignal);//发射信号int signalData = 42;sender.sendSignal(&signalData); return 0;
}

相关文章:

  • iOS Universal Links 配置
  • 算法家族之一——二分法
  • Blender + Marvelous Designer(MD)服装,Quad Remesher四边面拓扑布线、UV投射
  • 【ARM Cache 系列文章 1.1 -- Cache size 读取详细介绍及代码实现】
  • STM32F103单片机工程移植到航顺单片机HK32F103注意事项
  • Diffusers代码学习: T2I Adapter
  • 在vscode 中使用npm的问题
  • 【Spring Boot】异常处理
  • cad导入su线条不在一个平面怎么办?
  • Java | Leetcode Java题解之第132题分割回文串II
  • 分享一个用python写的本地WIFI密码查看器
  • 【risc-v】arm和riscv有什么关系或者联系?
  • Elasticsearch 管道查询语言 ES|QL 现已正式发布
  • 归一化在神经网络训练中的作用
  • 如何在React中创建自定义Hooks
  • $translatePartialLoader加载失败及解决方式
  • 230. Kth Smallest Element in a BST
  • const let
  • echarts的各种常用效果展示
  • ES10 特性的完整指南
  • ESLint简单操作
  • github从入门到放弃(1)
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • java第三方包学习之lombok
  • laravel5.5 视图共享数据
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mysql5.6主从复制
  • nginx 配置多 域名 + 多 https
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • php的插入排序,通过双层for循环
  • React-Native - 收藏集 - 掘金
  • 爱情 北京女病人
  • 程序员该如何有效的找工作?
  • 温故知新之javascript面向对象
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 大数据全解:定义、价值及挑战
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###STL(标准模板库)
  • #APPINVENTOR学习记录
  • #if #elif #endif
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (11)MATLAB PCA+SVM 人脸识别
  • (C语言)fread与fwrite详解
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)WCF的Binding模型
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (四)事件系统