qRegisterMetaType----Qt自定义的数据类型操作信号槽传递的参数

更新时间:2023-06-14 04:08:20 阅读: 评论:0

qRegisterMetaType----Qt⾃定义的数据类型操作信号槽传递的
参数
如果是⾃⼰定义的类型如果想使⽤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&");
#include <QMetaType>
//必须包含QMetaType,否则会出现下⾯错误:
//error: expected constructor, destructor, or type conversion before ‘;’ token
酸奶有营养吗
粒粒皆辛苦的古诗#include <QString>
take的短语class TextAndNumber {
public:
TextAndNumber();原的成语
TextAndNumber(int, QString);熊猫功夫
int count();
QString text();
private:
int m_count;
QString m_text;
};
Q_DECLARE_METATYPE(TextAndNumber);
#endif // TEXTANDNUMBER_H
int main(int argc, char *argv[])
{
简单好学的英文歌
QApplication app(argc, argv);
qRegisterMetaType<TextAndNumber>("TextAndNumber");
qRegisterMetaType<TextAndNumber>("TextAndNumber&");
TextDevice device;
TextThread foo("foo"), bar("bar");
QObject::connect(&foo, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));
QObject::connect(&bar, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));纸衣服的折法

本文发布于:2023-06-14 04:08:20,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/949770.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   队列   参数   定义   需要   传递   数据类型   操作
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图