程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Qt學習之路(10):Meta-Object系統

Qt學習之路(10):Meta-Object系統

編輯:關於C++

前面說過,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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved