前面說過,Qt使用的是自己的預編譯器,它提供了對C++的一種擴展。利用Qt的信號槽機制,就可以把彼此獨立的模塊相互連接起來,不需要實現知道模塊的任何細節。
為了達到這個目的,Qt提出了一個Meta-Object系統。它提供了兩個關鍵的作用:信號槽和內省。
面向對象程序設計裡面會講到Smalltalk語言有一個元類系統。所謂元類,就是這裡所說的Meta-Class。如果寫過HTML,會知道 HTML標簽裡面也有一個<meta>,這是用於說明頁面的某些屬性的。同樣,Qt的Meta-Object系統也是類似的作用。內省又稱為反射,允許程序在運行時獲得類的相關信息,也就是meta-information。什麼是meta-information呢?舉例來說,像這個類叫什麼名字?它有什麼屬性?有什麼方法?它的信號列表?它的槽列表?等等這些信息,就是這個類的meta-information,也就是“元信息”。這個機制還提供了對國際化的支持,是QSA(Qt Script for Application)的基礎。
標准C++並沒有Qt的meta-information所需要的動態meta-information。所以,Qt提供了一個獨立的工具,moc,通過定義Q_OBJECT宏實現到標准C++函數的轉變。moc使用純C++實現的,因此可以再任何編譯器中使用。
這種機制工作過程是:
首先,Q_OBJECT宏聲明了一些QObject子類必須實現的內省的函數,如metaObject(),tr(),qt_metacall()等;
第二,Qt的moc工具實現Q_OBJECT宏聲明的函數和所有信號;
第三,QObject成員函數connect()和disconnect()使用這些內省函數實現信號槽的連接。
以上這些過程是qmake,moc和QObject自動處理的,你不需要去考慮它們。如果實現好奇的話,可以通過查看QMetaObject的文檔和moc的源代碼來一睹芳容。
出處: http://devbean.blog.51cto.com/448512/199472