qobject的子類都有乙個staticmetaobject靜態成員變數,可通過staticmetaobject.newinstance()來建立這個類的例項。如果我們用qmap將類名和這個類的staticmetaobject成員變數對映起來,就可以實現通過類名建立類物件:
class
dialog
//繼承於qdialog的介面類
qmap map;
map[
"dialog"
]=dialog::staticmetaobject;
qwidget*w=
(qwidget*
)map[
"dialog"].
newinstance()
;
使用這個方法有三點需要注意:
1、繼承qobject或其子類
2、使用q_object巨集
3、建構函式前需要加上q_involkable
如果建構函式帶有引數的話,可以使用q_arg()傳入引數
假設有建構函式 dialog(qstring str);
建立時可這樣用:
qstring str=
"要傳入的引數";
dialog::staticmetaobject.
newinstance
(q_arg
(qstring,str)
);
newinstance()可以同時使用多個q_arg(),詳細資訊可參考qt幫助文件 C 反射 通過類名建立類例項
反射 其實就是利用程式集的元資料資訊。反射可以有很多方法,編寫程式時請先導入 system.reflection 命名空間。2 若要反射當前專案中的類 即當前專案已經引用它了 可以為 3 也可以為 參考 反射幫助類 public static class reflectionhelper 建立物件例...
C 根據類名建立類的例項物件
因為我使用這個方法的類都是和abstractscenepagedto處於乙個命名空間以及程式集下的,所以獲取命名空間和程式集的時候,直接使用abstractscenepagedto這個類進行獲取,這樣更準確一些,也不怕專案遷移改名。1 private t createactivityscenepag...
Qt程式設計 通過反射機制實現類名資訊動態建立物件技術
根據類名資訊動態建立物件技術,不僅可以降低 的耦合度和複雜性,還可以實現指令碼化程式設計技術,動態解析建立物件,提高記憶體利用率和應用程式靈活性。反射機制框架如下 reflect類宣告如下 typedef qwidget constructor qwidget parent class reflec...