自己用纯C++实现简单的QT中信号与槽机制
前天在我很久以前的一篇博文
(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中信号与槽机制的更多相关文章
- qt中信号与槽机制
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...
- QT的信号与槽机制介绍
信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗 ...
- Qt 的信号与槽机制介绍(10个要注意的问题)
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- 【qt】QT 的信号与槽机制
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- QT的信号和槽机制简介
信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部 ...
- QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式
1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...
- Qt的信号和槽机制
一.信号和槽机制 信号和槽用于两个对象之间的通信,我们希望任何对象都可以和其他对象进行通信. 当一个特殊的事情发生时便可以发射一个信号,而槽就是一个函数,它在信号发射后被调用来相应这个信号.( ...
- QT 的信号与槽机制介绍
https://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/ http://www.kuqin.com/qtdocume ...
- QT 的信号与槽
转载: QT 的信号与槽机制介绍 QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 ...
随机推荐
- java 获取当天(今日)零点零分零秒
两种方法 一种得到的是时间戳,一种得到是日期格式: 1.日期格式的 Calendar calendar = Calendar.getInstance(); calendar.setTime(new D ...
- 开源中文分词工具探析(七):LTP
LTP是哈工大开源的一套中文语言处理系统,涵盖了基本功能:分词.词性标注.命名实体识别.依存句法分析.语义角色标注.语义依存分析等. [开源中文分词工具探析]系列: 开源中文分词工具探析(一):ICT ...
- koa中间件机制详解
转自:https://cnodejs.org/topic/58fd8ec7523b9d0956dad945 koa是由express原班人马打造的一个更小.更富有表现力.更健壮的web框架. 在我眼中 ...
- Use Dynamic Data Masking to obfuscate your sensitive data
Data privacy is a major concern today for any organization that manages sensitive data or personally ...
- /usr/bin/uwsgi --http :8888 --wsgi-file wsgi.py --master --processes 4 --threads 2
/usr/bin/uwsgi --http :8888 --wsgi-file wsgi.py --master --processes 4 --threads 2 root 18756 0.0 0. ...
- Bayesian RL and PGMRL
简介: PGMRL: PGMRL就是把RL问题建模成一个概率图模型,如下图所示: 然后通过variational inference的方法进行学习: PGMRL给RL问题的表示给了一个范例,对解决很多 ...
- 释放锁标记只有在Synchronized代码结束或者调用wait()。
释放锁标记只有在Synchronized代码结束或者调用wait(). 注意锁标记是自己不会自动释放,必须有通知. 注意在程序中判定一个条件是否成立时要注意使用WHILE要比使用IF要严密. WHIL ...
- Java泛型知识点全方位总结
前言 我一直认为泛型是编程语言设计中一个非常基本和重要的概念.Java中的泛型是什么?他们为什么在那里?他们是如何发展的?在学习基础知识时,对仿制药的透彻理解是非常重要的.因此,我阅读了<Jav ...
- 深入理解String类详解
1.Stringstr = "eee" 和String str = new String("eee")的区别 先看一小段代码, 1 public static ...
- WordPress中默认文本编辑器替换成百度UEditor编辑器
1.下载 下载地址: http://pan.baidu.com/s/1geNk19L 2.解压放到plugins目录下 3.插件启用