信号槽是对象和对象之间的通信机制,类似于观察者模式。

object.h

#ifndef DB_OBJECT
#define DB_OBJECT
#include <map># define db_slots
# define db_signals protected
# define db_emitclass 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{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
#pragma once

object.cpp

#include <stdio.h>
#include <string.h>
#include "object.h"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);}
}static const char sig_names[] = "sig1";
static const char slts_names[] = "slot1";
MetaObject Object::meta = { sig_names, slts_names };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] == '/n')return idx;start = false;if (*pos == '/n') {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::sig1()
{MetaObject::active(this, 0);
}void Object::metacall(int idx)
{switch (idx) {case 0:slot1();break;default:break;};
}void Object::slot1()
{printf("hello dbzhang800!");
}void Object::testSignal()
{db_emit sig1();
}

main.cpp

int main(){Object obj1, obj2;Object::db_connect(&obj1, "sig1", &obj2, "slot1");obj1.testSignal();...
}

输出结果为:“hello dbzhang800!”

6. Qt 信号与信号槽(1)相关推荐

  1. Qt::ConnectionType(信号与槽的传递方式)

    Qt::AutoConnection 自动连接:(默认值)如果信号在接收者所依附的线程内发射,则等同于直接连接.如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接. Qt::DirectCo ...

  2. Qt for Python 信号和槽的使用详解

    前言 如果要说 Qt 里面的最常听到的词,那么 "信号"(signals)和"槽"(slots)绝对是其中之一了,其功能简单强大,想必每个 Qt 程序员最能理解 ...

  3. qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...

    前言勇哥对于C语言,C++早些年有一些接触,这个系列贴子就记载一下C++应用框架的学习经验. 在写程序时,UI.基础类库.应用程序框架对于vc来讲,只能依靠MFC和QT了. 勇哥对MFC有很强的抵触, ...

  4. QT中信号和信号槽详解

    如何选择QDialogButtonBox的信号与槽 1.UI中设计了一个QDialogButtonBox,按钮为Cancel和Apply: 2.构造函数连接: connect(ui->butto ...

  5. Qt eventFilter实现信号与槽

    对于Qt来说,信号与槽机制是其通信的一大亮点,但是Qt中也提供了其他的方法实现数据间的通信,如invokeMethod反射机制实现通信(https://blog.csdn.net/xx18030637 ...

  6. Qt工作笔记-信号与槽参数匹配问题

    今天,我把Qt3代码转化为Qt5,控件啥的都要换,李主任说了下为什么以前的信号和槽函数参数不匹配!!这句话让我对Qt中的信号与槽进一步有了了解. 下面的这个演示源码是基于这个博客的 https://b ...

  7. [转载]qt信号signal和槽slot机制

    好东西! 原文地址:qt信号signal和槽slot机制作者:fox1987 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注 ...

  8. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

  9. Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)

    Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) #include <QMetaType> CFileDataModel::CFileDataModel(QO ...

  10. Qt的特性——信号和槽

    Qt的特性--信号和槽 1. Qt的特性 2. 信号和槽 2.1 信号和槽机制概述 2.2 典型应用示例 2.3 信号和槽的关联 2.4 断开关联 2.5 信号和槽的高级应用 1. Qt的特性 Qt在 ...

最新文章

  1. 2万字看完腾讯最纯粹的一届WE大会:从黑洞、虫洞到克隆猴
  2. yarn 切换 设置 镜像 源
  3. git 你get了吗(git命令日常使用)
  4. php将文件夹打包zip文件,php将文件夹打包成zip文件
  5. SPOJ1812 LCS2
  6. ACL'21 | debug完的神经网络,如何测试是否仍然存在bug?
  7. php漂亮按钮代码,分享一款金属感十足的按钮样式代码
  8. ubuntu 安装多个CUDA版本并可以随时切换
  9. pe系统如何读取手机_在酷安你甚至可以学到如何用手机充当启动盘进PE(多图警告)...
  10. 输入银行卡号匹配银行名称
  11. android preference-headers 字体颜色,如何修改CheckBoxPreference 中title ,summary字体的颜色...
  12. ffmpeg 博客-雷霄骅
  13. C#学习记录——C#项目开发实战:快递单打印精灵(一)
  14. 【今日头条测试开发笔试】部分题目总结
  15. Task01:熟悉新闻推荐系统的基本流程(数据库设计)
  16. sql 同义词使用_使用同义词简化SQL Server代码
  17. SAP S4 FI后台详细配置教程- PART4 (科目及税费相关配置篇)
  18. 原生threeJS入门
  19. 王者荣耀服务器 延迟高,王者荣耀30ms延迟怎么弄的 30ms延迟设置方法
  20. 十八、ROS话题名称设置

热门文章

  1. c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)
  2. springboot 整合mybatis_SpringBoot整合MyBatis框架快速入门
  3. php 统计一周数据,如何获取本周、上周、本月、上个月数据的起止时间 PHP
  4. 建议收藏:服务器和存储技术知识
  5. 数据中心着火,工程师用嘴一吹就灭了?
  6. 阿里云华北区挂了。。。
  7. 数据中心级交换机考核方法
  8. 今年美国数据中心投资规模超182亿美元 超前三年总和
  9. 成功解决matplotlib绘图的时候横坐标或纵坐标文本显示不全/显示一半/显示不完整的问题
  10. SLAM:SLAM之VSLAM的简介