鍍金池/ 教程/ C/ Meta-Object 系統(tǒng)
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲(chǔ)容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對(duì)話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對(duì)話框之 QColorDialog
QPainter(續(xù))
國(guó)際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對(duì)象
QSortFilterProxyModel
國(guó)際化(上)
組件布局
自定義 Model 之三
事件過(guò)濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對(duì)話框之 QFileDialog
自定義 model 之二
深入了解信號(hào)槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對(duì)話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫(xiě)
自定義事件
編寫(xiě)跨平臺(tái)的程序
MainWindow
初探信號(hào)槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對(duì)話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫(xiě)
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲(chǔ)容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對(duì)話框(上)
一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(QWidget)

Meta-Object 系統(tǒng)

前面說(shuō)過(guò),Qt 使用的是自己的預(yù)編譯器,它提供了對(duì) C++ 的一種擴(kuò)展。利用 Qt 的信號(hào)槽機(jī)制,就可以把彼此獨(dú)立的模塊相互連接起來(lái),不需要實(shí)現(xiàn)知道模塊的任何細(xì)節(jié)。

為了達(dá)到這個(gè)目的,Qt 提出了一個(gè) Meta-Object 系統(tǒng)。它提供了兩個(gè)關(guān)鍵的作用:信號(hào)槽和內(nèi)省。

面向?qū)ο蟪绦蛟O(shè)計(jì)里面會(huì)講到 Smalltalk 語(yǔ)言有一個(gè)元類系統(tǒng)。所謂元類,就是這里所說(shuō)的 Meta-Class。如果寫(xiě)過(guò) HTML,會(huì)知道 HTML 標(biāo)簽里面也有一個(gè)meta,這是用于說(shuō)明頁(yè)面的某些屬性的。同樣,Qt 的 Meta-Object 系統(tǒng)也是類似的作用。內(nèi)省又稱為反射,允許程序在運(yùn)行時(shí)獲得類的相關(guān)信息,也就是 meta-information。什么是 meta-information呢?舉例來(lái)說(shuō),像這個(gè)類叫什么名字?它有什么屬性?有什么方法?它的信號(hào)列表?它的槽列表?等等這些信息,就是這個(gè)類的 meta-information,也就是“元信息”。這個(gè)機(jī)制還提供了對(duì)國(guó)際化的支持,是 QSA(Qt Script for Application)的基礎(chǔ)。

標(biāo)準(zhǔn) C++ 并沒(méi)有 Qt 的 meta-information 所需要的動(dòng)態(tài) meta-information。所以,Qt 提供了一個(gè)獨(dú)立的工具,moc,通過(guò)定義 Q_OBJECT 宏實(shí)現(xiàn)到標(biāo)準(zhǔn) C++ 函數(shù)的轉(zhuǎn)變。moc 使用純 C++ 實(shí)現(xiàn)的,因此可以在任何編譯器中使用。

這種機(jī)制工作過(guò)程是:

首先,Q_OBJECT 宏聲明了一些 QObject 子類必須實(shí)現(xiàn)的內(nèi)省的函數(shù),如 metaObject(),tr(),qt_metacall()等;

第二,Qt 的 moc 工具實(shí)現(xiàn) Q_OBJECT 宏聲明的函數(shù)和所有信號(hào);

第三,QObject 成員函數(shù) connect()和 disconnect()使用這些內(nèi)省函數(shù)實(shí)現(xiàn)信號(hào)槽的連接。

以上這些過(guò)程是 qmake,moc 和 QObject自動(dòng)處理的,你不需要去考慮它們。如果實(shí)現(xiàn)好奇的話,可以通過(guò)查看 QMetaObject 的文檔和 moc 的源代碼來(lái)一睹芳容。

本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031