前天在我很久以前的一篇博文
(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 上最为流行的 ...
随机推荐
-
hibernate三种状态
转自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transien ...
-
jstl-按照html的形式输出至页面
一.按照html的形式输出至页面 <c:out value="${xxx}" default="默认值" escapeXml="false&qu ...
-
[JVM-3]Java垃圾回收(GC)机制和垃圾收集器选择
哪些内存需要回收? 1.引用计数法 这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1:当引用失效时,计数器值-1.任何时刻计数值为0的对象就是不可能再被使用的.这 ...
-
include指令和<;jsp:include>;动作标识区别:--不明觉厉 先收藏
<jsp:include> 会通过转发的形式,分别编译被包含的文件,所以不怕重命名:而 include 是将多个被包含的原封不动合并后再一起编译一次,所以不可以重命名. ========= ...
-
2017 ACM 字符串的本质
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2017 思路:思考字符串和数字的本质区别是什么. 今天先是试着做了一个完全背包的题目,发现自己还是不会做,弄 ...
-
.net like模糊查询参数化
List<SqlParameter> paras = new List<SqlParameter>(); if (!string.IsNullOrEmpty(ciName)) ...
-
EOJ 3260 袋鼠妈妈找孩子
暴力搜索. 主要目的就是找到任意一条路径,使得路径长度大于等于$k+1$,写个爆搜发现很快能出解.判断某点是否可走,需要看四周有没有已经走过的点的$dis$比这个点的$dis$小$2$或者$2$以上. ...
- AD9516锁相环功能外接环路滤波器的设计与分析
-
windows下载Mysql-python
Mysql-python第三方模块官方不支持windows系统,而国外大学提供了非官方 的支持windows系统的模块,可前往 https://www.lfd.uci.edu/~gohlke/pyth ...
-
503. Next Greater Element II
https://leetcode.com/problems/next-greater-element-ii/description/ class Solution { public: vector&l ...