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

相关推荐
FRing0311 分钟前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)1 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..1 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert1 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
海的透彻2 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat3 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
北京中科新远科技3 小时前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架
开发语言·php
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
AI源码4 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python
旖旎夜光4 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习