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

相关推荐
小成202303202651 小时前
Linux高级02
linux·开发语言
知行合一。。。2 小时前
Python--04--数据容器(总结)
开发语言·python
咸鱼2.02 小时前
【java入门到放弃】需要背诵
java·开发语言
ZK_H2 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
A.A呐2 小时前
【C++第二十九章】IO流
开发语言·c++
椰猫子2 小时前
Java:异常(exception)
java·开发语言
lifewange2 小时前
pytest-类中测试方法、多文件批量执行
开发语言·python·pytest
cmpxr_2 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
2401_827499993 小时前
python项目实战09-AI智能伴侣(ai_partner_5-6)
开发语言·python
PD我是你的真爱粉3 小时前
MCP 协议详解:从架构、工作流到 Python 技术栈落地
开发语言·python·架构