Qt訊號槽機制的實現

2021-07-05 04:56:38 字數 850 閱讀 8649

因為面試時問了我這道題,導致我想去了解訊號槽到底是如何實現的,於是貼著順序看了下原始碼,大致了解了整個框架。網上關於訊號槽的文章也很多,但是大部分都是將如何應用的,這裡我就寫一下我所理解的如何實現吧, 由於時間倉促,原始碼閱讀的也不甚仔細,難免導致最終理解有偏差或錯誤,大家看出了請一定指正。

首先:訊號槽其實就是三部分組成:訊號的宣告,槽的宣告和實現 以及 connect函式。這其中我覺得最重要的就是這個connect函式了。

1:對於qt中的每個含有q_object的類物件,其內部都有乙個類物件資料成員等。我覺得他們是用來儲存乙個二維表的。亦即:是儲存的乙個訊號和槽的二維表。對於某乙個訊號:在二維表中存放著這個訊號對應的槽的函式指標!(面試官也問過我:想沒想過用函式指標來代替訊號槽)。所以:要想實現訊號槽,只需要把每個物件的這個表填滿就ok。而填滿的過程就是依據connect函式來做的。

2:對於乙個connect函式,其含有發出訊號的物件 和 接受者物件的指標,所以它可以同時操作這兩者。當執行到它時:它會依據接收者的指標去獲得:槽的函式指標,而後用這個函式指標值去填充發出訊號的物件的二維表。

3:當用connect填充好二維表之後:我們每次emit signal_1()時:其實就是依據這個訊號的名字去查詢二維表,找到對應的槽的函式指標並進行呼叫而已。

當然了,在具體實現上肯定沒這麼簡單,

1:依據訊號名來查詢槽的函式指標:其實是先依據訊號名找到其在物件內部的乙個代表引數,而後用這個引數去查詢。

2:每個物件在建立時都會建立乙個qmetaobejct元物件資料成員,這個主要功能之一就是用來做訊號槽的二維表的。

3:正如荊鵬大牛所言:這其中還有型別安全的檢查設定等等~~

所以:訊號槽這個東西也沒多麼神秘,我們完全可以自己架設這樣乙個構架。

Qt訊號槽機制的實現

因為面試時問了我這道題,導致我想去了解訊號槽到底是如何實現的,於是貼著順序看了下原始碼,大致了解了整個框架。網上關於訊號槽的文章也很多,但是大部分都是將如何應用的,這裡我就寫一下我所理解的如何實現吧,由於時間倉促,原始碼閱讀的也不甚仔細,難免導致最終理解有偏差或錯誤,大家看出了請一定指正。首先 訊號...

Qt訊號槽機制

c 的rtti機制功能有限 qt提供了元物件系統,使用該系統的基類qobject所建立和派生的類,可以再執行期獲取該物件的類名 父 類名,成員變數資訊,成員函式資訊,進而實現訊號槽機制。c 模擬 類定義檔案 object.h 1.ifndef db object 2.define db object...

qt 訊號槽機制

訊號 signals void startgetdatathread void sendpointer mainwindow 宣告乙個訊號要使用signals關鍵字。在signals前面不能使用public private和protected等限定符,因為只有定義該訊號的類及其子類才可以發射該訊號。...