Qt 信号槽收发自定义类/自定义结构体的2种方法
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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
相关文章
- Hello Qt——QMake用户指南[通俗易懂]
- VS中新建Qt项目工程后显示无法打开源文件“QtWidgets/QApplication”的解决方案「建议收藏」
- 一、Qt初尝试,做一个QT计算器《QT 入门到实战》
- C/C++ Qt 基本文件读写方法
- C/C++ Qt StringListModel 字符串列表映射组件
- Qt在Linux上的移植实践(qt移植到linux)
- VS中使用Qt方法详解
- Qt foreach关键字用法(无师自通)
- Linux Qt共享库开发指南(linuxqt共享库)
- 使用Qt框架轻松连接MySQL数据库(qt与mysql连接)
- 基于Linux的Qt程序开发实践(linux与qt程序设计)
- 在Linux上体验Qt的魅力(linux下运行qt)
- 跨平台应用使用Qt开发Linux跨平台应用(qt开发linux)
- Linux下Qt实现串口通信(linux下qt串口)
- 开启 linux 下强大的图形界面Qt(linuxqt图形界面)
- 解决Qt连接MySQL乱码问题(qtmysql乱码)
- 探索Linux世界:体验Qt桌面之美(linux桌面qt)
- QT实现对Oracle数据库的操作教程(qt操作oracle)
- 如何在Qt应用程序中访问MySQL数据库?(qt访问mysql)
- 使用Qt实现MySQL数据库连接教程(qt连接mysql数据库)
- QT开发MSSQL数据库技术实现(qt mssql)