前天在我很久以前的一篇博文
(http://blog.csdn.net/liukang325/article/details/45742675)
中有人回复说看到我的博文很激动,希望我详细介绍一下信号与槽的机制,想自己通过回调实现一下。我写的博客能帮助到你我也很激动!~所以就依我自己的理解简单实现一下供你参考~

只是一个最简单的信号。并没有实现 QT中信号还带参数传递的功能。想要更深入的理解,可以阅读一下QT的源码。

大家知道想要用Qt中的信号槽。离不开QObject,那么我就写个最简单的KObject
KObject.h

#include <map>
# define kslots
# define ksignals public
# define kemit

class KObject;
struct MetaObject
{
static void active(KObject * sender, int idx);
};
struct Connection
{
KObject * receiver;
int sltID;
};
typedef std::map<int, Connection> ConnectionMap;
class KObject
{
friend class MetaObject;
static MetaObject meta;

public:
KObject();
virtual ~KObject();
static void kconnect(KObject*, int, KObject*, int);

protected:
virtual void metacall(int sltID) = 0;
ksignals:
//void sigtest();
public kslots:
//void slottest();
private:
ConnectionMap connections;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
KObject.cpp

#include "KObject.h"

void MetaObject::active(KObject* sender, int sigID)
{
Connection c = sender->connections[sigID];
c.receiver->metacall(c.sltID);
}

KObject::KObject(){}

KObject::~KObject(){}

void KObject::kconnect(KObject* sender, int sigID, KObject* receiver, int sltID)
{
Connection c = {receiver, sltID};
sender->connections.insert(std::pair<int, Connection>(sigID, c));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
接下来写两个测试的类,继承于KObject
TestClassA.h

#include "KObject.h"
class TestClassA : public KObject
{
public:
TestClassA();

protected:
void metacall(int sltID);

ksignals:
typedef enum{
SIG_HELLOWORLD,
}SIG_ID;

void sigTestA(int sigID);
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TestClassA.cpp

#include "TestClassA.h"
TestClassA::TestClassA()
{
}

void TestClassA::metacall(int sltID)
{
}

void TestClassA::sigTestA(int sigID)
{
MetaObject::active(this, sigID);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
TestClassB.h

#include "KObject.h"

class TestClassB : public KObject
{
public:
TestClassB();

void metacall(int sltID);

public kslots:

typedef enum{
SLT_HELLOWORLD = 2,
}SLT_ID;

void slotTestB();
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TestClassB.cpp

#include "TestClassB.h"

TestClassB::TestClassB()
{
}

void TestClassB::metacall(int sltID)
{
switch (sltID) {
case SLT_HELLOWORLD:
slotTestB();
break;
default:
break;
};
}

void TestClassB::slotTestB()
{
QDBG << "hello world TestB";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
最后写main函数

TestClassA a;
TestClassB b;
KObject::kconnect(&a, TestClassA::SIG_HELLOWORLD, &b, TestClassB::SLT_HELLOWORLD);
a.sigTestA(TestClassA::SIG_HELLOWORLD);
1
2
3
4
调用的是a.sigTestA(TestClassA::SIG_HELLOWORLD);
会打印TestClassB::slotTestB()中的”hello world TestB”;

以上三个类所有的代码不过百来行,实现的是最基本最简单的一个类信号触发另一个类的槽函数。这里信号只是一个ID,没有像QT中那样丰富的实现信号函数,还带有多种参数传递,以及多种connect的写法。

这个例子只是方便你很简单的理解两个类之间信号与槽是怎么传递的。
希望对你有帮助~

转载请注明来源:http://blog.csdn.net/liukang325/article/details/78151601
---------------------
作者:阳光柠檬_
来源:CSDN
原文:https://blog.csdn.net/liukang325/article/details/78151601
版权声明:本文为博主原创文章,转载请附上博文链接!

自己用纯C++实现简单的QT中信号与槽机制的更多相关文章

  1. qt中信号与槽机制

    一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...

  2. QT的信号与槽机制介绍

      信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗 ...

  3. Qt 的信号与槽机制介绍(10个要注意的问题)

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  4. 【qt】QT 的信号与槽机制

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  5. QT的信号和槽机制简介

    信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部 ...

  6. QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式

    1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...

  7. Qt的信号和槽机制

    一.信号和槽机制 信号和槽用于两个对象之间的通信,我们希望任何对象都可以和其他对象进行通信.     当一个特殊的事情发生时便可以发射一个信号,而槽就是一个函数,它在信号发射后被调用来相应这个信号.( ...

  8. QT 的信号与槽机制介绍

    https://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/ http://www.kuqin.com/qtdocume ...

  9. QT 的信号与槽

    转载: QT 的信号与槽机制介绍 QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 ...

随机推荐

  1. ExpandableListView使用(三)-ScrollView嵌套ExpandableListView,列表显示不全

    前言 ScrollView嵌套ExpandableListView会出现ExpandableListView列表显示不全,目前比较好的方法是复写ExpandableListView,重写里面的onMe ...

  2. 深入理解Linux内存分配

    深入理解Linux内存分配 为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化.除此 ...

  3. [转]ThreadLocal使用

    引言 ThreadLocal的官方API解释为: “该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线 ...

  4. 【LeetCode】二叉搜索树的前序,中序,后续遍历非递归方法

    前序遍历 public List<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> list = n ...

  5. TF常用知识

    命名空间及变量共享 # coding=utf-8 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt; ...

  6. (原)ffmpeg过滤器开发和理解

    最近学习了ffmpeg关于filter过滤器的开发,关于中间的几个相关概念,我们先放在简单介绍一下: AVFilterGraph:几乎完全等同与directShow中的fitlerGraph,代表一串 ...

  7. return在try...except...finally...中的表现

    一直以为return就直接退出函数了,最近遇到一情况,在try中return,并没有什么卵用,还是会去执行finally里的内容,导致不能正确返回想要的数据 一直以为return就会跳出函数,发现原来 ...

  8. IIS 配置详解 请求长度限制调整

    当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is ...

  9. windows 安装python pip Could not install packages due to anEnvironmentError: [WinError 5] 拒绝访问

    找打 C:\Windows\System32 文件夹下面的cmd.exe点开后运行python -m pip install --upgrade pip 即解决问题了.

  10. 基于Gradle的spring boot 项目构建

    今天听只是分享,听到不用maven而使用Gradle构建,就尝试了下 Java三大构建工具:Ant.Maven和Gradle Gradle是一个基于Apache Ant和Apache Maven概念的 ...