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

相关推荐
小小马喽_Thendras2 分钟前
ScheduledExecutorService 和Timer的区别
java·开发语言
报错小能手11 分钟前
ios开发方向——swift内存基础
开发语言·ios·swift
minji...12 分钟前
Linux 多线程(四)线程等待,线程分离,线程管理,C++多线程,pthread库
linux·运维·开发语言·网络·c++·算法
麦德泽特14 分钟前
基于 Go 语言的 Modbus 项目实战:构建高性能、可扩展的工业通信服务器
服务器·开发语言·golang·modbus·rtu
还是大剑师兰特20 分钟前
pnpm format 什么作用
开发语言·javascript·ecmascript
QuZero23 分钟前
Java Synchronized principle
java·开发语言
单片机学习之路29 分钟前
【Python】输入input函数
开发语言·python
cch891839 分钟前
ThinkPHP6.x全面升级:性能与功能双飞跃
开发语言·vue.js·后端·golang
yangyanping2010842 分钟前
Go语言学习之Go Gin 生产级 flag 启动命令模板
开发语言·学习·golang
冉佳驹42 分钟前
Qt【第七篇】 ——— QSS 样式表与绘图 API 核心用法及 UI 定制功能总结
qt·qbrush·qpainter·qss·paintevent·qpen