zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt 信号槽收发自定义类/自定义结构体的2种方法

Qt方法 自定义 结构 信号 收发
2023-09-14 09:05:11 时间

想要发射信号时,携带自定义的class或者struct,必须要做一下处理,否则编译时不会报错,但运行时会出错。

假设我们自定义了一个结构体:

1 typedef struct
2 {
3     ...//
4     ...//
5 }Frame7E;

如果想要这么用:

1 Frame7E frame;
2 ...//填充frame
3 emit sendFrame(frame);

那么必须使用以下两种方法之一。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

方法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开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓