W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
前面說過,Qt 使用的是自己的預(yù)編譯器,它提供了對 C++ 的一種擴展。利用 Qt 的信號槽機制,就可以把彼此獨立的模塊相互連接起來,不需要實現(xiàn)知道模塊的任何細節(jié)。
為了達到這個目的,Qt 提出了一個 Meta-Object 系統(tǒng)。它提供了兩個關(guān)鍵的作用:信號槽和內(nèi)省。
面向?qū)ο蟪绦蛟O(shè)計里面會講到 Smalltalk 語言有一個元類系統(tǒng)。所謂元類,就是這里所說的 Meta-Class。如果寫過 HTML,會知道 HTML 標(biāo)簽里面也有一個meta,這是用于說明頁面的某些屬性的。同樣,Qt 的 Meta-Object 系統(tǒng)也是類似的作用。內(nèi)省又稱為反射,允許程序在運行時獲得類的相關(guān)信息,也就是 meta-information。什么是 meta-information呢?舉例來說,像這個類叫什么名字?它有什么屬性?有什么方法?它的信號列表?它的槽列表?等等這些信息,就是這個類的 meta-information,也就是“元信息”。這個機制還提供了對國際化的支持,是 QSA(Qt Script for Application)的基礎(chǔ)。
標(biāo)準(zhǔn) C++ 并沒有 Qt 的 meta-information 所需要的動態(tài) meta-information。所以,Qt 提供了一個獨立的工具,moc,通過定義 Q_OBJECT 宏實現(xiàn)到標(biāo)準(zhǔn) C++ 函數(shù)的轉(zhuǎn)變。moc 使用純 C++ 實現(xiàn)的,因此可以在任何編譯器中使用。
這種機制工作過程是:
首先,Q_OBJECT 宏聲明了一些 QObject 子類必須實現(xiàn)的內(nèi)省的函數(shù),如 metaObject(),tr(),qt_metacall()等;
第二,Qt 的 moc 工具實現(xiàn) Q_OBJECT 宏聲明的函數(shù)和所有信號;
第三,QObject 成員函數(shù) connect()和 disconnect()使用這些內(nèi)省函數(shù)實現(xiàn)信號槽的連接。
以上這些過程是 qmake,moc 和 QObject自動處理的,你不需要去考慮它們。如果實現(xiàn)好奇的話,可以通過查看 QMetaObject 的文檔和 moc 的源代碼來一睹芳容。
本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: