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种方法。

相关推荐
程序员小郭83几秒前
Spring Ai 05 ChatClient Advisor 实战(日志、提示词增强、内容安全)
java·开发语言·前端
tryCbest5 分钟前
Python之FastAPI 开发框架(第三篇):高级特性与实战
开发语言·python·fastapi
2301_776508728 分钟前
分布式系统监控工具
开发语言·c++·算法
Irissgwe9 分钟前
Linux进程信号
linux·服务器·开发语言·c++·linux进程信号
暮冬-  Gentle°10 分钟前
C++与区块链智能合约
开发语言·c++·算法
JobDocLS11 分钟前
Bash调试方法
开发语言·bash
Oueii12 分钟前
C++中的代理模式实现
开发语言·c++·算法
艾莉丝努力练剑14 分钟前
【Linux:文件 + 进程】理解IPC通信
linux·运维·服务器·开发语言·网络·c++·ide
洋不写bug16 分钟前
Java线程(二):线程特点、状态、终止开始控制(
java·开发语言
ZTLJQ17 分钟前
挖掘金矿:Python数据解析库完全解析
开发语言·python