1. 程式人生 > >實現自己的訊號與槽機制-借鑑Qt

實現自己的訊號與槽機制-借鑑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