前面我們知道使用q_property巨集可以為類建立變數,但是那只是靜態變數。在qobject中載入和儲存一些屬性也是可能的,即新增動態屬性。
到現在位置,我們已經對用q_property巨集定義的那些屬性進行了專門處理。這些屬性對該類的qmetaobject是可知,且有對應的qmetaproperty與之對應。同乙個類的所有物件會共享同乙個metaobject,因而會有相同的元屬性組。另一方面,在執行時獲得動態屬性的情況下,同乙個類的兩個物件會具有相同的元屬性列表,但對於動態屬性可以有不同動態屬性列表。
class
dynoprops
:public qobject
void
setsomestring
(qstring ss)
qstring propsinventory()
;private
: qstring m_somestring;};
qstring dynoprops::
propsinventory()
res <<
"dynamic properties:"
; foreach (qbytearray dpname,
dynamicpropertynames()
)return res.
join
("\n");
}
以上函式給出了一種顯示固定屬性和動態屬性的方法。固定屬性的清單來自qmetaobject。使用qmetaproperty::read()
或者qobject::property()
可以查詢屬性的值。propertycount()
函式會設定對qmetaproperty清單進行遍歷的條件。
qmetaobject無法知道動態屬性。那麼,如果要知道動態屬性必須得使用qobject的一些方法。可以對利用qobject::dynamicpropertynames()
返回的qlist清單中的名稱進行遍歷,並可用qobject::property()
獲得其值。
使用和輸出:
int
main
(int argc,
char
*argv)
執行結果
fixed properties:
objectname d1
somestring
dynamic properties:
intprop 42
realprop 3.1415926
fixed properties:
objectname d2
somestring
dynamic properties:
qmetatype是乙個用於值型別的輔助類(helper class)。對於內建60多種資料型別,qmetatype為每個型別id都關聯了乙個型別名,從而使構造和析構可用在執行時動態發生。有乙個名稱為qmetatype::type
的公共列舉,它有所有qvariant相容型別的值。即qmetatype::type
中的列舉值與qvariant::type
中的列舉值一樣。
通過使用q_enums巨集,我們可以在qvariant系統中加入一些自定義的列舉型別。使用q_declare_metatype(mytype)
巨集把自己定義的值型別加到qmetatype列表中。它需要提供乙個公共的預設建構函式,公共的拷貝建構函式和公共的析構函式。ps:編譯器預設的即可。
--
----
----
----
----
----
-h--
----
----
-------
class
computer
int a;};
q_declare_metatype
(computer) tag1
----
----
----
----
----
---cpp--
----
----
-------
int fractype = qmetatype::
type
("computer");
//returns a handle to the type called typename, or 0 if there is no such type.[.
..] computer com(2
);qvariant var;
var.
setvalue
(com)
; cout << var.value()
.a <----
----
----
----
----
--output--
----
----
----
----
2582
如果將tag1行注釋掉,則輸出為報錯。error: 'qt_metatype_id' is not a member of 'qmetatypeid'
要註冊的元型別必須已經用q_declare_metatype宣告過。模板函式qregistermetatype()
會註冊型別t並返回由qmetatype使用的內部id。這個函式有乙個過載版本,qregistermetatype(const char* name)
,同樣也是用來註冊型別並返回id 。在使用型別t作為訊號和槽的引數時,qregistermetatype()
必須在第乙個連線之前呼叫。即在連線訊號和槽之前呼叫。
Oracle靜態註冊和動態註冊
b 一 什麼是註冊?b 註冊就是將資料庫作為乙個服務註冊到監聽程式。客戶端不需要知道資料庫名和例項名,只需要知道該資料庫對外提供的服務名就可以申請連線到資料庫。這個服務名可能與例項名一樣,也有可能不一樣。在資料庫伺服器啟動過程中,資料庫伺服器會向監聽程式註冊相應的服務 無論何時啟動乙個資料庫,預設地...
TS 的型別宣告和變數型別
一 型別宣告 型別宣告是 ts 非常重要的乙個特點,通過型別宣告可以指定 ts 中變數 引數 形參 的型別 當為變數賦值時,ts編譯器會自動檢查值是否符合型別宣告,符合則賦值,否則報錯 簡而言之,型別宣告給變數設定了型別,使得變數只能出儲存某種型別的值,這是 js 不具備的 語法 let a num...
動態註冊廣播和使用
在接收的裡面進行註冊 intentfilter filter new intentfilter filter.addaction message type 可更改,用於判斷傳送者的身份,註冊傳送者 mreceiver new mycase 廣播接收者 registerreceiver mreceiv...