元物件系統如何識別自定義型別

2021-09-28 11:34:03 字數 1843 閱讀 2183

如何識別自定義型別,並將自定義型別物件通過訊號槽傳遞給接收物件,需要依靠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...