The Qt signals/slots and property system are based on the ability to introspect the objects at runtime.
C++ does not offer introspection support natively, so Qt comes with a tool to provide it. That tool is MOC.
It parses the header files and generates an additional C++ file that is compiled with the rest of the program
  (1) signals, slots fucntion are simple functions, but MOC will see them
  (2) Q_OBJECT defines a bunch of functions and a static QMetaObject, all signals/connections are stored here

we can get the deatails about it from https://woboq.com/blog/how-qt-signals-slots-work.html

write one very simple and similar example that implements signala and slot:

// file :QObject.h
#include<map>
#define SIGNAL int
#define SLOT void
#define CONNECT(ObjectA,signal,ObjectB,slot) ObjectA.getMeta()->connection.insert(std::pair<int,void*>(signal,(void*)new Caller(ObjectB,slot)))
#define EMIT(ObjectA,signal) ObjectA.activate(signal) class Caller
{
public:
class icaller{ public:virtual void run() = ; };
template<class T>
class caller :public icaller {
public:
caller(T * obj, void(T::*call)()) :object(obj), func(call){}
virtual void run(){ (object->*func)(); }
T * object;
void(T::*func)();
};
template<class T>
Caller(T*object, void (T::*clk)()){ p = new caller<T>(object, clk); }
icaller * p;
void run() { p->run(); }
}; struct QmetaObject
{
std::map<int, void*> connection;
}; class QObject
{
public:
QmetaObject * getMeta(){ return &metadata; }
// we can create a new thread, queue the caller
void activate(int sig){ Caller * pfunc = (Caller*)getMeta()->connection.at(sig); pfunc->run(); }
private:
// metadata
QmetaObject metadata;
};

the functionality of class Caller see here:http://www.cnblogs.com/resibe-3/p/6639151.html

#include"QObject.h"
#include<iostream>
class myclassA : public QObject{
public:
myclassA() :A(){}
SIGNAL A;
}; class myclassB : public QObject{
public:
SLOT B(){ std::cout << " function B was called" << std::endl;}
}; void callback(){ myclassB bb; bb.B(); }
void pushbutton(myclassA aa){
// suppose we push an button aa,
// if we adopt signal-slot mechanism, it will emit a signal here
EMIT(aa, aa.A);
// if we use callback,then
// callback();
} int main()
{
myclassA aa;
myclassB bb;
CONNECT(aa, aa.A, &bb, &myclassB::B);
pushbutton(aa);
}

signal & slot的更多相关文章

  1. QT窗体间传值总结之Signal&Slot

    在写程序时,难免会碰到多窗体之间进行传值的问题.依照自己的理解,我把多窗体传值的可以使用的方法归纳如下: 1.使用QT中的Signal&Slot机制进行传值: 2.使用全局变量: 3.使用pu ...

  2. 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

    使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...

  3. QT 中 关键字讲解(emit,signal,slot)

    Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法.作为一种通用的处理机制,信号与反应槽非常灵活,可以携 ...

  4. Qt_深入了解信号槽(signal&slot)

    转自豆子空间 信号槽机制是Qt编程的基础.通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯.这就将类之间的关系做了最大程度的解耦. 槽函数和普通的C++成员函数没有很大的区别.它们也可以使 ...

  5. Signal & Slot in Qt

    Try your best to provide an mechanism to implement what you want. 1. All is generated by QT Framewor ...

  6. QML于C++交互之信号与槽(signal&slot )

    connect c++ SIGNAL with QML SLOT 简介 QML 与 C++ 混合编程时,总结了一下qml和c++互相直接调用.及信号与槽连接 的几种情况,详细使用情况看示例代码 所有的 ...

  7. slot signal机制

    有一个比较 经典的实现:http://sigslot.sourceforge.net/很精简的 signal slot的实现,跨平台.webrtc项目在用,我在自己项目里也用了.这个源码有2000多行 ...

  8. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  9. 【golang-GUI开发】qt之signal和slot(一)

    想了很久,我决定还是先从signal和slot(信号槽)开始讲起. signal和slot大家一定不陌生,先看一段示例(选自文档): class Counter : public QObject { ...

随机推荐

  1. MyEclipse做的项目改成eclipse能用的

    转至:https://blog.csdn.net/cymlancy/article/details/67634531 首先导入一个从Myeclipse导出的项目 Myeclipse项目和Eclipse ...

  2. python socket 编程

    TCP IPv4 # server.py import socket import threading import time s = socket.socket(socket.AF_INET,soc ...

  3. SQL Server进阶 索引

    create unique index 和create index 的区别? CREATE UNIQUE INDEX ProviderInfo_Id_uindex ON dbo.ProviderInf ...

  4. JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

    $(function(){ pushHistory(); window.addEventListener("popstate", function(e) { alert(" ...

  5. pycharm中创建包时加入的_init_.py文件及_all_的作用

    init__.py的主要作用是: 1. Python中package的标识,不能删除 2. 定义__all__用来模糊导入 3. 编写Python代码(不建议在__init__中写python模块,可 ...

  6. Canvas画圆形

    转载:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#圆弧 function d ...

  7. Django相关面试题

    Django框架的生命请求周期 浏览器上输入地址,回车然后发生了什么? => Http请求生命周期 ? 什么是wsgi 以及作用? 中间件 中间件的执行流程? 中间件的执行流程? 说一下Djan ...

  8. 第25月第11天 deeplearning.ai

    1.网易云课堂 深度学习工程师 点击进入课程地址(英文)(收费) 点击进入课程地址(中文)(免费) 第一门 神经网络和深度学习 第二门 改善神经网络 第三门 结构化机器学习项目 第四门 卷积神经网络 ...

  9. Linux之vi编辑器的使用

    今天我们来说一下vi编辑器的使用,vi编辑器主要用来在Linux环境下编辑配置文件. 一.使用方法: 1.输入命令 vi filename,打开文件,处于一个查看模式 2.点击键盘 i,进入inser ...

  10. ListBox、ListCtrl

    设置编辑框滚动条在最新的位置 //CEdit* editBox=(CEdit*)GetDlgItem(IDC_EDIT_RECV); //(editBox->LineScroll(editBox ...