Qt註冊自定義型別

2021-09-16 13:36:10 字數 1129 閱讀 8596

如果要在qt訊號槽中使用自定義型別,需要注意使用qregistermetatype對自定義型別進行註冊,當然在不跨執行緒時使用自定義型別signal/slot來傳遞,可能不會出現什麼問題;一旦涉及跨執行緒就很容易出錯,回想下訊號槽的作用就是用來物件與物件之間通訊的,難免會跨執行緒,建議在使用自定義型別利用訊號槽通訊時,最好先通過qregistermetatype()將自定義型別進行註冊,以免出錯。

總結qregistermetatype使用方法如下:

1、註冊位置:在第一次使用此類鏈結跨執行緒的signal/slot之前,一般在當前類的建構函式中進行註冊;

2、註冊方法:在當前類的頂部包含:#include ,建構函式中加入**:qregistermetatype("myclass");

3、myclass的引用型別需單獨註冊:qregistermetatype("myclass&");

如果是自己定義的型別如果想使用signal/slot來傳遞的話,則沒有這麼簡單。直接使用的話,會產生下面這種錯誤:

qobject::connect: cannot queue arguments of type 'textandnumber' (make sure 'textandnumber' is registed using qregistermetatype().)
原因:當乙個signal被放到佇列中(queued)時,它的引數(arguments)也會被一起一起放到佇列中(queued起來),這就意味著引數在被傳送到slot之前需要被拷貝、儲存在佇列中(queue)中;為了能夠在佇列中儲存這些引數(argument),qt需要去construct、destruct、copy這些物件,而為了讓qt知道怎樣去作這些事情,引數的型別需要使用qregistermetatype來註冊(如錯誤提示中的說明)

步驟:(以自定義textandnumber型別為例)

自定一種型別,在這個型別的頂部包含:#include

在型別定義完成後,加入宣告:q_declare_metatype(textandnumber);

在main()函式中註冊這種型別:qregistermetatype("textandnumber");

如果還希望使用這種型別的引用,可同樣要註冊:qregistermetatype("textandnumber&");

Qt之註冊自定義型別訊號槽函式

typedef struct mytype 在構造裡面新增即可 qregistermetatype mytype 註冊自定義型別訊號槽 使用方法和平時使用一樣 signals void sgl slt mytype mytype type public slots void slt mytype m...

Qt自定義資料型別

qt框架下開發時,建立乙個自定義型別,需要確保建立的這個自定義型別符合qmetatype規定的所有要求,即它必須滿足以下幾個條件 下面的message類的定義滿足這些條件,可以定義成乙個新的資料型別 class message q declare metatype message 這個類還提供了乙個...

qt序列化自定義物件 Qt之建立自定義型別

摘要 簡述 當使用qt建立使用者介面時,特別是那些帶有特殊控制和特徵的介面時,開發者通常需要建立新資料型別來擴充套件或替換qt現有的的值型別集合。標準型別,比如 qsize qcolor和qstring都可以被儲存到qvariant物件中,在基於qobject的類中可用作屬性的型別,並且可以在訊號 ...