参考文章:https://blog.csdn.net/perfectguyipeng/article/details/78082360

原理基础介绍

Qt中通过object类定义了connect函数,在connect函数中实现了将信号与槽函数的对应关系
这种对应关系记录在元对象类中,信号函数的定义由元对象处理器定义,在这一步可以确定信号触发时,槽函数被调用的过程。

主要理解一下几个函数:
static void db_connect(Object*, const char*, Object*, const char*);
void MetaObject::active(Object* sender, int idx)

#ifndef DB_OBJECT
#define DB_OBJECT
#include <map>
# define db_slots
# define db_signals protected
# define db_emit
class Object;
struct MetaObject  //元对象类
{const char* sig_names;const char* slts_names;static void active(Object* sender, int idx);
};
struct Connection
{Object* receiver;int method;
};
typedef std::multimap<int, Connection> ConnectionMap;
typedef std::multimap<int, Connection>::iterator ConnectionMapIt;class Object //object类
{static MetaObject meta;void metacall(int idx);
public:Object();virtual ~Object();static void db_connect(Object*, const char*, Object*, const char*);void testSignal();
db_signals:void sig1();public db_slots:void slot1();friend class MetaObject;
private:ConnectionMap connections;
};
#endif 
#include "object.h"#include <stdio.h>
#include <string.h>
Object::Object()
{}
Object::~Object()
{}
static int find_string(const char* str, const char* substr)
{if (strlen(str) < strlen(substr))return -1;int idx = 0;int len = strlen(substr);bool start = true;const char* pos = str;while (*pos) {if (start&& (!strncmp(pos, substr, len))&& (pos[len] == '\0')){return idx;}start = false;if (*pos == '\0') {idx++;start = true;}pos++;}return -1;
}
void Object::db_connect(Object* sender, const char* sig, Object* receiver, const char* slt)
{int sig_idx = find_string(sender->meta.sig_names, sig);int slt_idx = find_string(receiver->meta.slts_names, slt);if (sig_idx == -1 || slt_idx == -1) {perror("signal or slot not found!");}else {Connection c = { receiver, slt_idx };sender->connections.insert(std::pair<int, Connection>(sig_idx, c));}
}
void Object::slot1()
{printf("hello dbzhang800!");
}
void MetaObject::active(Object* sender, int idx)
{ConnectionMapIt it;std::pair<ConnectionMapIt, ConnectionMapIt> ret;ret = sender->connections.equal_range(idx);for (it = ret.first; it != ret.second; ++it) {Connection c = (*it).second;c.receiver->metacall(c.method);}
}
void Object::testSignal()
{db_emit sig1();
}
#include "object.h"
static const char sig_names[] = "sig1";
static const char slts_names[] = "slot1";
MetaObject Object::meta = { sig_names, slts_names };// *** 元对象类的实现*********
void Object::sig1()
{MetaObject::active(this, 0);
}
void Object::metacall(int idx)
{switch (idx) {case 0:slot1();break;default:break;};
}
#include "object.h"
int main()
{Object obj1, obj2;Object::db_connect(&obj1, "sig1", &obj2, "slot1");obj1.testSignal();return 0;;
}

Qt中消息的机制原理相关推荐

  1. Qt中事件循环机制详解

    问题1:Qt中常见的事件有哪些? 答:鼠标事件(QMouseEvent).键盘事件(QKeyEvent).绘制事件(QPaintEvent).窗口尺寸改变(QResizeEvent).滚动事件(QSc ...

  2. 中的枚举属性函数_软件特攻队|Qt中的反射机制之Q_PROPERTY

    接触过Java的同学肯定知道"反射"这一神器,而所谓的反射,指的是对于任意的一个类,即使在运行状态下,都能知道这个类的所有方法和属性,并可以动态调用这些方法的一种机制. 但是非常遗 ...

  3. QT中Model-View-Delegate委托代理机制用法介绍

    文章目录 本地数据加载(Data) 添加数据模型(Model) 添加代理模型(Proxy) 添加元素的代理(Delegate) 添加视图层(View) 使用效果 之前的一篇文章中介绍过QT的委托代理机 ...

  4. Qt基础之四:Qt信号与槽机制原理及优缺点

    目录 一.简介 二.信号和槽 三.信号(signals) 四.槽(slots) 五.在Qt中使用第三方的Signals和Slots 信号

  5. 基于Windows Socket 的网络通信中的心跳机制原理

    引言 在采用TCP 连接的C/S 结构的系统中,当通信的一方正常关闭或退出时,另一方能收到相应的连接 断开的通知,然后进行必要的处理:但如果任意一方发生所谓的"非优雅断开",如:意 ...

  6. 【转】ActiveMQ消息传送机制以及ACK机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 本文转载自 http://shift-alt-ctrl.iteye.com/blog/2020182 AcitveMQ是作为一 ...

  7. ActiveMQ消息传送机制以及ACK机制详解

    2019独角兽企业重金招聘Python工程师标准>>> AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全 ...

  8. Kafka设计解析(八)- Exactly Once语义与事务机制原理

    本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本文所有Kafka原理性的描述除特殊说明外均基于Kafka 1.0.0版 ...

  9. 安卓自定义View进阶-事件分发机制原理【转自 app架构师 微信公众号】

    注意:本文中所有源码分析部分均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的. 为什么要有事件分发机制? 安卓上面的View是 ...

最新文章

  1. C#中 ??、 ?、 ?: 、?.、?[ ] 问号
  2. 哈密顿路径_检查图形是否为哈密顿量(哈密顿路径)
  3. MOSS中代码运行的权限提升(半摘)
  4. 团建之后,我想离职了
  5. Android和.NET通用的AES算法
  6. nginx配置详解(转)
  7. 对Map集合排序,先对value降序,value相同的情况下,key升序
  8. java 1.8 64_JDK 1.8 64位 下载 安装 配置
  9. TDA4VM芯片手册阅读笔记
  10. java规则引擎Drools实战
  11. OpenRefine 开启远程访问模式
  12. c#email格式不正确_C#校验Email(电子邮件)地址是否合法
  13. 那些黑天鹅教会我们的IT知识
  14. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time datetime模块...
  15. 具象的东西_艺术家宋永红:我喜欢具象的东西
  16. 构建人工智能评测平台(体系)
  17. 龙与地下城用户名_多用户地下城如何教我编程
  18. mix2s刷Android7,小米Mix2s刷机教程
  19. 解决电脑连上wifi无法上网问题
  20. cocos creator粒子不变色_Cocos Creator 3D 粒子系统初战: 不要钱的酷炫火焰拿走不谢!...

热门文章

  1. c# List 按类的指定字段排序
  2. JS----面试题总结(持续更新中......)
  3. JS----JavaScript中的递归函数
  4. 用原生JavaScript实现简单轮播图
  5. 弹出对话框拖拽JavaScript实现
  6. JS页面跳转的各种形式
  7. echarts生成json地图最简单代码
  8. 中石油计算机组成原理a在线考试,计算机组成原理试题A.doc
  9. java 数组中差值最大数对,[算法题] 求数组有序后相邻元素之间的最大差值
  10. 函数最值题目及答案_呆哥数学每日一题 ——多元函数求最值