動態屬性和元型別的宣告和註冊

2021-07-25 08:27:28 字數 2926 閱讀 4189

前面我們知道使用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...