如何識別自定義型別,並將自定義型別物件通過訊號槽傳遞給接收物件,需要依靠q_declare_metatype(type)巨集進行修飾,其中你的類必須包含該型別必須有公有的 構造、析構、複製構造 函式,如果想在(queued)訊號和槽系統中使用或者想在qobject的屬性系統中使用,就必須使用qregistermetatype()這個函式註冊到元物件系統中,這個在qml中呼叫c++時常用到。
如果要使自定義型別或其他非qmetatype內建型別在qvaiant中使用,必須使用該巨集。
該型別必須有公有的 構造、析構、複製構造 函式
qregistermetatype 必須使用該函式的兩種情況
如果非qmetatype內建型別要在 qt 的屬性系統中使用
如果非qmetatype內建型別要在 queued 訊號與槽 中使用
struct tempinfo
;q_declare_metatype(tempinfo) //申明為元物件型別 但是不一定會註冊到元物件型別
#ifndef structtestproperty_h
#define structtestproperty_h
#include #include #include struct tempinfo
;q_declare_metatype(tempinfo)
class structtestproperty : public qobject
; explicit structtestproperty(qobject *parent = nullptr);
// 通過qvariantmap 傳值
q_invokable qvariantmap getcurrentweatherinfo();
//test
void test();
signals:
void sendsig(tempinfo tmpinfo);
private:
// 天氣資訊
weatherinfo m_weatherinfo;
//test
tempinfo m_tempinfo;
};class jsonpropertytest: public qobject
void setjsondata(const qstring &json)
signals:
void sigsendjsondata(const qstring &data);
public slots:
void onslotreceive(tempinfo info);
private:
qstring m_jsondata;
};#endif // structtestproperty_h
#include "structtestproperty.h"
#include #include #include structtestproperty::structtestproperty(qobject *parent)
: qobject(parent)
qvariantmap structtestproperty::getcurrentweatherinfo()
void structtestproperty::test()
;//q_declare_metatype(tempinfo)
則在編譯過程中會報如下錯誤
參考部落格:
自定義物件如何監聽
我們平時總是對sun公司設計好的物件進行監聽,有時候我們需要對自己設計的物件進行監聽 如下 package com.protelnet.demo 觀察者設計模式 observer設計模式 事件源 class person public void eat system.out.println eat ...
物件型別陣列 自定義排序
我們可以對任何物件型別的陣列排序,比如,物件person有名字和年齡屬性,我們希望根據年齡排序,那麼我們可以這麼寫 const friends function compareperson property if a property b property return 0 console.log ...
自定義型別
typedef型別 typedef 已有型別 新建型別 示例 typedef double area,volume typedef int number number i1 area a enum enum 列舉型別名 enum week 預設sun 0,可以比較 如果修改必須形如enum week...