qt框架下開發時,建立乙個自定義型別,需要確保建立的這個自定義型別符合qmetatype
規定的所有要求,即它必須滿足以下幾個條件:
下面的message
類的定義滿足這些條件,可以定義成乙個新的資料型別:
class message
;q_declare_metatype(message);
這個類還提供了乙個帶引數的建構函式和用於訪問兩個私有成員的公有函式。
對於message
類,僅需要乙個簡單的實現,即可以使用,但是在qt框架下,若沒有其它的輔助資訊,系統將無法理解這個類的儲存方式、檢索方式以及序列化方式。比如,我們無法將該類的值儲存到qvariant
中。因此,我們需要對該類進行宣告。
qt中,負責自定義型別的類是qmetatype
,為了讓這個類識別自定義的資料型別,需要在定義message
類的標頭檔案中使用q_declare_metatype()
巨集宣告。
q_declare_metatype(message);
經過宣告後,便可以將message
類的值儲存到qvariant
物件中,以便在專案的其它地方讀取。用q_declare_metatype()
宣告的自定義型別, 其對應的值可用作訊號signal()
的引數,但是僅限於directconnection
訊號槽連線方式。為了能滿足全部的訊號槽連線方式,我們還需要做一些其它的處理。
雖然上面宣告的自定義型別,可以在directconnection
訊號槽連線中使用,但是無法用於queuedconnection
訊號連線中,比如,在不同執行緒間建立的連線。這是因為元物件系統不知道如何在執行時處理自定義型別物件的建立和銷毀操作。
為了可以在執行時建立物件、需要呼叫qregistermetatype()
模板函式在元物件系統中註冊此型別。只要在使用此型別第一次建立連線前呼叫註冊函式,該型別即可被用於queuedconnection
訊號槽連線。
下面的示例中,在main.cpp
中註冊了乙個message
類,而後在information
類中繫結訊號。
int main(int argc, char *ar**)
//下面是information類的相關呼叫
information::information()
若型別未經註冊而直接繫結在queuedconnection
訊號槽中,則會報如下錯誤:
qobject::connect: cannot queue arguments of type 『block』 (make sure 『block』 is registered using qregistermetatype().)
struct player
;q_declare_metatype(player);
player player;
object->setproperty("property", qvariant::fromvalue(player));
為了更方便一點,你可以在自定義型別中定義乙個qvariant() 型別轉換符
ruct player
};player player;
object->setproperty("property", player);
qdebug
line qdebug operator<<(qdebug debug, const player& player)
qdatastream
inline qdatastream& operator<<(qdatastream& out, const player& player)
inline qdatastream& operator>>(qdatastream& in, player& player)
qsettings
qsettings 用qvariant儲存鍵值,用qdatastream序列化自定義資料。(參考後面的varianttostring函式)
為了能在qsettings中使用自定義資料型別,需要讓qt的元系統知道有此型別,就像上面介紹qvariant部分一樣,另外還要提供相應的qdatastream操作符,還必須註冊這個流操作符:
qregistermetatypestreamoperators("player");
如此處理之後我們就可以像下面這樣使用了:
qsettings settings;
player player;
settings.setvalue("key", player);
qsettings settings;
player player = value("key").value();
自定義資料型別
include include using namespace std typedef double weight,tall struct student int main cout for int i 0 i 4 i return 0 貼上正確的輸出 這裡tall和weight都是自己可以輸入的 ...
自定義資料型別 列舉型別
學習了乙個月c語言,卻從來沒有更新過部落格,沒有總結的學習是不完整的。好了,其實我是走c 方向的,就提前看了c 的有關內容。c 除了和c語言一樣常用的資料型別,他們還有允許使用者自己來設計的一些資料型別,比如列舉型資料,結構型資料和鍊錶。我就簡單的總結下列舉型別。列舉型別允許使用者自己來定義一種資料...
自定義資料型別 結構型別
c 中自定義資料型別還有一種稱為結構型別,並且把該型別的各種資料型別一一整合到其中。學號 型別 姓名 字串 學生年齡 整型 院系 字串 平均成績 浮點型 每個學生的資訊成為了乙個整體,雜亂的資料和每個學生一一對應了起來,方便管理。如果需要建立學生型別,就可以這樣寫。include using nam...