解析Qt元物件系統(一) 概述

2021-08-21 15:22:44 字數 2166 閱讀 3059

meta-object system 提供了qt的訊號和槽機制以及物件之間的互相通訊,執行時的資訊和動態屬性系統。

三個必要條件:

1. qobject的子類

2. 巨集q_object

3. meta object compiler

qt官方建議對自定義的qobject子類都要加這個巨集,但要注意:某些類不是繼承自qobject,這些類裡加q_object就會出錯,例如qevent,qgraphicsitem,qrunnable.

moc的實現是乙個預處理器,使用moc的方式,所有平台上的標準的c++編譯器都能支援qt。從而不需要實現乙個新的跨平台的qt編譯器。moc是為了解決反射的問題,但是一些動態的程式語言(如python,ruby等)中,語言本身自帶反射功能。qt程式之所以編譯速度慢,主要是因為在 qt 將源**交給標準c++編譯器,如gcc之前,需要事先將這些擴充套件的語法去除掉。完成這一操作的就是 moc。

如果工程是用qmake生成makefile進行編譯,那麼其中就包含了呼叫moc的規則,我們不必直接使用moc.exe。moc.exe會讀取標頭檔案,檢視是否有q_object巨集定義,如果有則根據這個標頭檔案生成相應的moc_.cpp,該檔案同樣將進入編譯系統,最終被鏈結到二進位制**中去,qtcreator生成的**就是通過編譯鏈結時,把moc_widget.o與其他目標檔案鏈結到一起,這種方式不用改源**,相對而言比較順眼。

moc_.cpp主要實現了標頭檔案中的q_object巨集和signal,也就是將qt擴充套件的語法去掉,再交給c++編譯器。

signal只在標頭檔案做宣告,但我們寫qt程式時從不進行實現,因為它是在moc_.cpp裡實現的,

例如無引數訊號void text();的實現:

void

mainwindow

::text()

有引數訊號void time(qdatetime t);的實現:

void mainwindow::time(qdatetime _t1)

; qmetaobject::activate(this, &staticmetaobject, 1, _a);

}

主要呼叫qmetaobject::activate方法,staticmetaobject是這個類預設的乙個靜態元物件。第三個引數是訊號對應的序數。第四個引數如果是nullptr則代表訊號無引數,否則代表引數的指標。

moc檔案也可以在cpp檔案中被include,qt官方示例很多就是這樣做的,我們也可以這樣寫常見的mainwindow程式:

#include

class mainwindow : public qmainwindow

~mainwindow()

{}};#include "main.moc"

int main(int argc, char *argv)

編譯之前先執行qmake,以處理巨集q_object,生成main.moc。如果沒有#include "main.moc",會報錯:

無法解析3個外部符號,即moc檔案中實現的3個函式:qt_metacall, qt_metacast, metaobject

元物件系統涉及到的類: qmetatype, qmetamethod, qmetaobject, qmataclassinfo, qmetaenum, qmetadatareadercontrol, qmetaproperty,

qmatatype是qt所支援的元型別,有個type的列舉,這個列舉列表中的所有型別是qt訊號槽機制本身就支援的,大部分的型別實際在巨集qt_for_each_static_type中包含。如果是自定義的型別需要用qregistermetatype去註冊元型別才能被qt的訊號槽所識別。

qmetamethod有個重要的成員函式invoke,支援跨執行緒呼叫,是基於元物件系統的。

qmetaobject是元物件類本身,實現了qmetaobject::invokemethod, 功能和qmetamethod沒有什麼區別。提供了元物件系統的基本方法,包括方法/訊號槽/屬性的數目/序數等等方法。

qmataclassinfo提供了類的附加資訊。

元物件系統的一些常用工具:

作業系統(一)概述

學習資料 作業系統 清華大學出版社 2012 一 功能 1.管理系統的各個部件,使它們能夠正常運轉 2.給上層的應用軟體提供乙個易於理解和程式設計的介面 二 角色 對於作業系統的設計者,作業系統是系統資源的管理者 如何管理cpu 記憶體 i o裝置等系統部件 對於應用程式開發人員,作業系統是一組抽象...

作業系統(一) 概述

作業系統是緊貼硬體之上,所有其他軟體之下 是其它軟體的環境 用來管理硬體 使cpu i o裝置和儲存空間能夠有效利用,管理分配軟硬體資源,合理組織計算機工作流程 作業管理,程序管理 實現使用者介面 彌補硬體系統的型別和數量的差別 將覆蓋了軟體的機器稱為擴充機器或虛擬機器,因此,os是擴充套件機 虛擬...

嵌入式系統(一)概述

二 嵌入式系統晶元 三 嵌入式系統硬體和軟體系統基本組成 以應用為中心,計算機技術為基礎,軟硬體可裁剪,適用應用系統對功能等方面有嚴格要求的專用計算機系統。1 為了某些特殊應用,可以對軟硬體構成就行不斷的調整。把數字計算機系統分成通用計算機和嵌入式系統兩大類。通用計算機是指如微型計算機 pc 大型計...