[QT入門篇]4QT的元對(duì)象系統(tǒng)-創(chuàng)新互聯(lián)

QT對(duì)C++進(jìn)行了擴(kuò)展,提供了三個(gè)主要的功能:信號(hào)槽、運(yùn)行時(shí)類型信息和動(dòng)態(tài)屬性,這三個(gè)擴(kuò)展功能都是由“元對(duì)象系統(tǒng)”提供的。

成都創(chuàng)新互聯(lián)專注于雙城企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,電子商務(wù)商城網(wǎng)站建設(shè)。雙城網(wǎng)站建設(shè)公司,為雙城等地區(qū)提供建站服務(wù)。全流程專業(yè)公司,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

元對(duì)象系統(tǒng)基于三個(gè)支撐點(diǎn):

1 OObject為需要使用元對(duì)象系統(tǒng)有點(diǎn)的類提供了基類。

2 Q_OBJECT宏聲明在類的私有段中,可用來啟用元對(duì)象特征,如動(dòng)態(tài)屬性,信號(hào)槽。

3 元對(duì)象編譯器(moc)為每一個(gè)QObject子類提供了實(shí)現(xiàn)元對(duì)象特征的必要代碼。

MOC工具讀取C++源代碼。如果它發(fā)現(xiàn)一個(gè)或者多個(gè)類的聲明包括了宏Q_OBJECT,它產(chǎn)生另一個(gè)C++源代碼文件,這個(gè)文件中包含了含有宏Q_OBJCET類的元對(duì)象代碼。這個(gè)新產(chǎn)生的源文件或者被包含值類的源文件中或者,或者更通常的是被編譯和鏈接到類的的實(shí)現(xiàn)中。

元對(duì)象系統(tǒng)除了提供信號(hào)和槽機(jī)制(介紹元對(duì)象系統(tǒng)的主要原因),還提供如下特征:

1 QObject::metaObject()返回了類關(guān)聯(lián)的元對(duì)象;

2 QMetaObjcet::className()在運(yùn)行時(shí)返回字符串形式的類名稱,不需要通過C++編譯器的原始運(yùn)行時(shí)類型信息支持。

3 QObject::inherits()方法返回一個(gè)對(duì)象是否是QObject類或者QObject子類的實(shí)例。

4 QObject::tr()和Qobject::trUtf8()用來完成國際化;

5 QObject::SetProperty()和QObject::property()通過名稱動(dòng)態(tài)的設(shè)置和獲取屬性;

6 QMetaObject::newInstance()構(gòu)造類的新實(shí)例。

對(duì)QObject類也可以使用動(dòng)態(tài)轉(zhuǎn)換qobject_cast(),qobject_cast()函數(shù)與標(biāo)準(zhǔn)C++dynamic_cast()的行為很像,優(yōu)點(diǎn)是不需要RTTI支持,并且它可以跨動(dòng)態(tài)庫邊界。qobject_cast()嘗試將它的參數(shù)轉(zhuǎn)換到特定的指針類型,如果對(duì)象是正確的類型(在運(yùn)行時(shí)判斷)返回非0指針,如果不兼容則返回0。

看下面的例子。我們假設(shè)MyWidget繼承了Qwidget并且聲明了宏Q_OBJECT:

QObject *obj = new MyWidget;

變量Obj是QObject類型,實(shí)際引用到一個(gè)MyWidget對(duì)象,所以我們可以轉(zhuǎn)換:

QWidget *widget = qobject_cast<QWidget *>(obj);

從QObject到QWidget的轉(zhuǎn)換是成功的,因?yàn)閛bj實(shí)際上就是一個(gè)MyWidget,是Qwidget的子類。現(xiàn)在我們知道obj是一個(gè)MyWidget對(duì)象,我們可以轉(zhuǎn)換到MyWidget *:

MyWidget *myWidget = qobject_cast<MyWidget *>(obj);

到MyWidget的轉(zhuǎn)換也是成功的,因?yàn)閝object_cast()對(duì)待QT內(nèi)建類型和自定義類型之間沒有區(qū)別的。

下面的轉(zhuǎn)換則是失敗的:

QLabel *label = qobject_cast<QLabel *>(obj);

obj到Qlabel的轉(zhuǎn)換是失敗的。label也被設(shè)置為0。

這種運(yùn)行時(shí)類型信息機(jī)制可以在運(yùn)行時(shí)處理不同類型的對(duì)象,比如:

 if (QLabel *label = qobject_cast<QLabel *>(obj))
 {
        label->setText(tr("Ping"));
    } 
else if (QPushButton *button = qobject_cast<QPushButton *>(obj)) {
        button->setText(tr("Pong!"));
}

當(dāng)然也可以使用QObject做為基類卻不使用Q_OBJECT宏,這樣的類就沒有了元對(duì)象代碼,前文提到的信號(hào)槽和其他特征也就都失效了。從元對(duì)象系統(tǒng)的觀點(diǎn)來看,一個(gè)不使用元代碼QObject子類等效于它最近的使用元對(duì)象代碼的祖先。這就意味著,QMetaObject::className() 將會(huì)返回祖先的類名而不是實(shí)際類的名字。

因此強(qiáng)烈建議大家,所有QObject的子類都使用Q_OBJECT宏,無論是否使用了信號(hào)槽和動(dòng)態(tài)屬性。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁標(biāo)題:[QT入門篇]4QT的元對(duì)象系統(tǒng)-創(chuàng)新互聯(lián)
文章分享:http://muchs.cn/article34/dhehpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)企業(yè)建站、建站公司靜態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司