想要发射信号时,携带自定义的class或者struct,必须要做一下处理,否则编译时不会报错,但运行时会出错。
假设我们自定义了一个结构体:
1 typedef struct
2 {
3 ...//
4 ...//
5 }Frame7E;
如果想要这么用:
1 Frame7E frame;
2 ...//填充frame
3 emit sendFrame(frame);
那么必须使用以下两种方法之一。
方法1:使用宏:Q_DECLARE_METATYPE
该方法的原理是使得QVariant类支持我们自定义的类型,而QT的信号槽是支持发射QVariant类型数据的,然后我们可以用QVariant封装这个自定义类/结构,然后emit 出去QVariant类型的变量。
1 #include <qmetatype.h>
2 //发射端
3 Frame7E frame;
4 ...//填充frame
5 QVariant var;
6 var.setValue(frame); // copy s into the variant
7 emit sendFrame(var);//发QVariant类型的信号
8
9
10 接收端
11 // retrieve the value
12 Frame7E s2 = var.value<Frame7E>();//QVariant 转换为 Frame7E
方法2:使用qRegisterMetaType函数使得QT的信号槽支持自定义类型
1 #include <QMetaType>
2
3 //注册自定义类型,使QT的信号槽支持我们的类型
4 qRegisterMetaType<Frame7E>("Frame7E");//参数无所谓,建议带上同名字符串参数
注册完之后,就可以正常使用信号槽了。
需要注意以下几点:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include <QMetaType>,构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass");
3、Myclass的引用类型需单独注册:qRegisterMetaType<MyClass>("Myclass&");
分类:
Qt
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2021-01-06 VTK 体绘制_体绘制管线&图形渲染管线
2021-01-06 VTK 图形基本操作进阶_纹理映射
2021-01-06 VTK 图形基本操作进阶_点云配准技术(迭代最近点ICP算法)
2021-01-06 VTK 图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)
2021-01-06 VTK 图形基本操作进阶_表面重建技术(三维点云曲面重建)
2021-01-06 VTK 图形基本操作进阶_表面重建技术(等值面提取)
2021-01-06 VTK 图形基本操作进阶_表面重建技术(三角剖分)