Q_DECLARE_METATYPE和qRegisterMetaType

3 篇文章 0 订阅

1. Q_DECLARE_METATYPE(type)

1.1 应用范围:当需要再QVariant中自定义一个type时,需要使用Q_DECLARE_METATYPE(type)为type提供一个public 默认构造函数, public 拷贝构造函数和public 析构函数,并使QMetaType识别type。

1.2应用方法:理想情况下,需要将该声明放在一个类或结构体声明之后。如果无法这样做,还可以定义一个私有头文件,每次使用type时都需要包括该头文件。

如果想要将type用于queued signal和slot connections或者QObject的属性系统,还必须使用qRegisterMetaType(),因为type名称是再运行时解析的。后面这种方法在qml文件中链接C++类时经常用到。

// 声明方式
struct MyStruct
{
    int i;
    ...
};

Q_DECLARE_METATYPE(MyStruct)
// 或者
namespace MyNamespace
{
    ...
}

Q_DECLARE_METATYPE(MyNamespace::MyStruct)
// 应用方法
MyStruct s;
QVariant var;
var.setValue(s); // copy s into the variant

...

// retrieve the value
MyStruct s2 = var.value<MyStruct>();

若希望自定义类type具备stream操作,则应该在type类的定义中重载相关操作符

QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
QDataStream &operator>>(QDataStream &in, MyClass &myObj);

2. template <typename T> int qRegisterMetaType()和template <typename T> int qRegisterMetaType(const char *typeName)

2.1 应用范围:调用该函数来注册类型T,T必须通过Q_DECLARE_METATYPE()返回meta type 的id

// 示例#1
int id = qRegisterMetaType<MyStruct>();
//  示例#2 
qRegisterMetaType<MyClass>("MyClass");
// 示例#3
typedef QString CustomString;
qRegisterMetaType<CustomString>("CustomString");
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ಥ_ಥLeerorz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值