Qt注册自定义类型

Qt注册自定义类型

==================================

Qt 注册自定义类型

一、自定义类型注册必要性

如果要在Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册,当然在不跨线程时使用自定义类型signal/slot来传递,可能不会出现什么问题;一旦涉及跨线程就很容易出错,回想下信号槽的作用就是用来对象与对象之间通信的,难免会跨线程,建议在使用自定义类型利用信号槽通信时,最好先通过qRegisterMetaType()将自定义类型进行注册,以免出错。

二、qRegisterMetaType使用方法

总结qRegisterMetaType使用方法如下:

1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;

2、注册方法:在当前类的顶部包含:#include <QMetaType>,

构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass");

3、Myclass的引用类型需单独注册:

qRegisterMetaType<MyClass>("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 <QMetaType>

 

    在类型定义完成后,加入声明:

    Q_DECLARE_METATYPE(TextAndNumber);

 

    在main()函数中注册这种类型:

    qRegisterMetaType<TextAndNumber>("TextAndNumber");

 

如果还希望使用这种类型的引用,可同样要注册:

    qRegisterMetaType<TextAndNumber>("TextAndNumber&");

————————————————
版权声明:本文为CSDN博主「夏之七」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/locahuang/article/details/110221959

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值