实现自己的信号与槽机制-借鉴Qt

如果对Qt的信号与槽机制不太理解可以查看以下网址:

http://blog.csdn.net/fuyunzhishang1/article/details/48345381

该博主讲的十分的清楚。

最近我自己在做基于嵌入式的GUI,重构了好几遍总觉得自己的消息机制很繁琐,直到自己看到了Qt。

并稍微的了解了下其中的实现原理,觉得精妙无比,想下定决心自己也做一个。但是一开始就遇到了问题:

Qt是使用了预处理器,把signal:和slot:下的方法提取了放在meta对象中,但是我又没有这个预处理器。

但是Qt的connect机制真的很好呀!所以我改变了方式进行实现:


使用的时候格式就是这样的,表达比Qt复杂。

先实现一个存放消息和槽的connection class,里面存放了信号函数的地址,槽函数的链表地址,接收者对象链表的地址。

(其实Qt是用HashMap的key-value对实现的,我这边觉得实现有些麻烦就用链表来存储了)

接下去是存放一个一个connection连接体的连接体链表

每个对象都有一个connectList容器,当使用了connect函数的时候就会创建一个connection来存储,并把它存入connectList容器中。

这样当一个对象的signal函数触发时就会遍历自己的connectList容器,找到相应的receiver和slot地址进行结合执行。

这样就实现了消息触发槽的方式。

现在一想觉得自己和Qt的实现方式是很多不一样的,但是本质都是用一个函数去触发另一个函数,只是我的直接用函数地址传递方式。

具体的代码我也不好抽出来,就放上GitHub整个项目吧。

GitHub:https://github.com/909452726/tGui_v3

猜你喜欢

转载自blog.csdn.net/shungry/article/details/78863193