Meta-Object系統

Meta-Object系統
標籤:Qt C++ 學習 QT教程 教程
前面說過,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

發佈了7 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章