Qt编程中采用signal传递自定义数据类型

本文介绍Qt编程中采用signal传递自定义数据类型(结构体类型)。

Qt编程中可以通过signal传递标准类型,如常见的int,QString,bool类型,有时候需要传递特定的数据类型如结构体,Qt是不支持直接传递的,若将其分开进行传递,变量太多,造成程序编写麻烦。这里介绍2种方法使signal可以传递自定义数据类型。

1.采用QVariant进行封装的方法

1)定义自定义数据类型

这里定义我们要传递的自定义数据类型,即1个结构体类型。

cpp 复制代码
typedef struct _TEST
{
    int a;
    int b;
    bool c;
}TEST;
Q_DECLARE_METATYPE(TEST);

注意这里需要采用Q_DECLARE_METATYPE()宏对新定义的类型进行声明。

2)定义相应的signal和slot

cpp 复制代码
signals:
void sgnParams(QVariant var);

//other classes
slots:
void slotParams(QVariant var);

这里的形参为QVariant类型,因此,我们要将新定义的类型封装成QVariant类型。

3)封装

因为我们要采用QVariant类型进行传递,因此需要将结构体封装成QVariant类型。在相应的函数中采用如下方式处理:

cpp 复制代码
TEST test;
QVariant var;

test.a = 300;
test.b = 200;
test.c = false;

var.setValue(test);

Q_EMIT sgnParams(var);

4)读取

在对应的槽函数中,对采用QVariant类型的数据进行读取。可采用如下方式进行处理:

cpp 复制代码
TEST test;

if (var.canConvert<TEST>()) {

    test = var.value<TEST>();
    //process

}

2.注册自定义数据类型的方法

1)定义自定义数据类型

这里定义我们要传递的自定义数据类型,即1个结构体类型。

cpp 复制代码
typedef struct _TEST
{
    int a;
    int b;
    bool c;
}TEST;

2)构造函数中注册新类型

cpp 复制代码
qRegisterMetaType<TEST>("TEST");

在相应的构造函数种注册我们刚定义的新类型。

2)定义相应的signal和slot

cpp 复制代码
signals:
void sgnParams(TEST test);

//other classes
slots:
void slotParams(TEST test);

注意这里的形参直接采用自定义数据类型,因为我们已经向系统注册了这种新类型。

3)发送

cpp 复制代码
TEST test;

test.a = 300;
test.b = 200;
test.c = false;

Q_EMIT sgnParams(test);

发送直接赋值即可。

4)接收

cpp 复制代码
qDebug() << test.a << test.b << test.c;

接收直接获取形参值,和标准类型操作一样的。

总结,本文节介绍了Qt编程中采用signal传递自定义数据类型的2种方法。

相关推荐
木向13 分钟前
leetcode22:括号问题
开发语言·c++·leetcode
comli_cn15 分钟前
使用清华源安装python包
开发语言·python
筑基.21 分钟前
basic_ios及其衍生库(附 GCC libstdc++源代码)
开发语言·c++
雨颜纸伞(hzs)35 分钟前
C语言介绍
c语言·开发语言·软件工程
J总裁的小芒果37 分钟前
THREE.js 入门(六) 纹理、uv坐标
开发语言·javascript·uv
坊钰1 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang11 小时前
leetcode hot100 LRU缓存
java·开发语言
时雨h1 小时前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
云计算DevOps-韩老师2 小时前
【网络云计算】2024第52周-每日【2024/12/25】小测-理论&实操-自己构造场景,写5个系统管理的脚本-解析
开发语言·网络·云计算·bash·perl
暮色尽染2 小时前
Python 正则表达式
开发语言·python