Qt中消息的机制原理
参考文章: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中消息的机制原理相关推荐
- Qt中事件循环机制详解
问题1:Qt中常见的事件有哪些? 答:鼠标事件(QMouseEvent).键盘事件(QKeyEvent).绘制事件(QPaintEvent).窗口尺寸改变(QResizeEvent).滚动事件(QSc ...
- 中的枚举属性函数_软件特攻队|Qt中的反射机制之Q_PROPERTY
接触过Java的同学肯定知道"反射"这一神器,而所谓的反射,指的是对于任意的一个类,即使在运行状态下,都能知道这个类的所有方法和属性,并可以动态调用这些方法的一种机制. 但是非常遗 ...
- QT中Model-View-Delegate委托代理机制用法介绍
文章目录 本地数据加载(Data) 添加数据模型(Model) 添加代理模型(Proxy) 添加元素的代理(Delegate) 添加视图层(View) 使用效果 之前的一篇文章中介绍过QT的委托代理机 ...
- Qt基础之四:Qt信号与槽机制原理及优缺点
目录 一.简介 二.信号和槽 三.信号(signals) 四.槽(slots) 五.在Qt中使用第三方的Signals和Slots 信号
- 基于Windows Socket 的网络通信中的心跳机制原理
引言 在采用TCP 连接的C/S 结构的系统中,当通信的一方正常关闭或退出时,另一方能收到相应的连接 断开的通知,然后进行必要的处理:但如果任意一方发生所谓的"非优雅断开",如:意 ...
- 【转】ActiveMQ消息传送机制以及ACK机制详解
2019独角兽企业重金招聘Python工程师标准>>> 本文转载自 http://shift-alt-ctrl.iteye.com/blog/2020182 AcitveMQ是作为一 ...
- ActiveMQ消息传送机制以及ACK机制详解
2019独角兽企业重金招聘Python工程师标准>>> AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全 ...
- Kafka设计解析(八)- Exactly Once语义与事务机制原理
本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本文所有Kafka原理性的描述除特殊说明外均基于Kafka 1.0.0版 ...
- 安卓自定义View进阶-事件分发机制原理【转自 app架构师 微信公众号】
注意:本文中所有源码分析部分均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的. 为什么要有事件分发机制? 安卓上面的View是 ...
最新文章
- C#中 ??、 ?、 ?: 、?.、?[ ] 问号
- 哈密顿路径_检查图形是否为哈密顿量(哈密顿路径)
- MOSS中代码运行的权限提升(半摘)
- 团建之后,我想离职了
- Android和.NET通用的AES算法
- nginx配置详解(转)
- 对Map集合排序,先对value降序,value相同的情况下,key升序
- java 1.8 64_JDK 1.8 64位 下载 安装 配置
- TDA4VM芯片手册阅读笔记
- java规则引擎Drools实战
- OpenRefine 开启远程访问模式
- c#email格式不正确_C#校验Email(电子邮件)地址是否合法
- 那些黑天鹅教会我们的IT知识
- python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time datetime模块...
- 具象的东西_艺术家宋永红:我喜欢具象的东西
- 构建人工智能评测平台(体系)
- 龙与地下城用户名_多用户地下城如何教我编程
- mix2s刷Android7,小米Mix2s刷机教程
- 解决电脑连上wifi无法上网问题
- cocos creator粒子不变色_Cocos Creator 3D 粒子系统初战: 不要钱的酷炫火焰拿走不谢!...
热门文章
- c# List 按类的指定字段排序
- JS----面试题总结(持续更新中......)
- JS----JavaScript中的递归函数
- 用原生JavaScript实现简单轮播图
- 弹出对话框拖拽JavaScript实现
- JS页面跳转的各种形式
- echarts生成json地图最简单代码
- 中石油计算机组成原理a在线考试,计算机组成原理试题A.doc
- java 数组中差值最大数对,[算法题] 求数组有序后相邻元素之间的最大差值
- 函数最值题目及答案_呆哥数学每日一题 ——多元函数求最值