Qt動態對映qobject cast

2021-08-19 17:26:45 字數 978 閱讀 9594

對於qobject及其子類可以通過qobject_cast()函式進行動態對映dynamic cast。

假設qmywidget是qwidget的子類,並且在類定義中宣告了q_object巨集,

qobject *obj = new qmywidget();
obj實際指向qmywidget類,所以可以正確投射為qwidget

qwidget *widget = qobject_cast(obj);
obj實際是qmywdiget類,是qwidget的子類,投射是成功的。

qobject_cast並不區分qt內建的型別和使用者自定義的型別。

若要講obj投射到qlabel則是失敗的

返回的label是null,因為qmywidget不是qlabel的子類

使用動態投射,使得程式在遇到不同的物件做不同的處理

qlabel *label = qobject_cast(obj);'
以下為例項:

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include #include #include mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

mainwindow::~mainwindow()

void mainwindow::showobject(qobject *obj)

qmetaobject::classname( )函式可返回類的名稱字串。

其實這個就是c++的虛函式實現的。

動態對映和靜態對映

先說virtualalloc和virtualcopy virtualalloc 首先會從我們的虛擬位址空間中申請 或者說預留 一塊虛擬空間,準備接下來要用它。注意此時,可用的物理記憶體並沒有減少,只是虛擬位址少了一塊可用的區域。真正把這塊之前 reserved 的虛擬空間對映到物理的記憶體區域就是由...

qt的記憶體對映

uchar qfiledevice map qint64 offset,qint64 size,qfiledevice memorymapflags flags nooptions 從偏移量開始將檔案的大小位元組對映到記憶體中。應該開啟乙個檔案以使對映成功,換句話說就是對映必須開啟乙個檔案,但在對映...

ibatis 動態對映

在複雜查詢過程中,我們常常需要根據使用者的選擇決定查詢條件,這裡發生變化的並不只是sql 中的引數,包括select 語句中所包括的字段和限定條件,都可能發生變化。典型情況,如在乙個複雜的組合查詢頁面,我們必須根據使用者的選擇和輸入決定查詢的條件組合。乙個典型的頁面如下 對於這個組合查詢頁面,根據使...