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


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

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

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

    1)定义自定义数据类型

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

    1. typedef struct _TEST
    2. {
    3. int a;
    4. int b;
    5. bool c;
    6. }TEST;
    7. Q_DECLARE_METATYPE(TEST);

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

    2)定义相应的signal和slot

    1. signals:
    2. void sgnParams(QVariant var);
    3. //other classes
    4. slots:
    5. void slotParams(QVariant var);

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

    3)封装

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

    1. TEST test;
    2. QVariant var;
    3. test.a = 300;
    4. test.b = 200;
    5. test.c = false;
    6. var.setValue(test);
    7. Q_EMIT sgnParams(var);

    4)读取

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

    1. TEST test;
    2. if (var.canConvert()) {
    3. test = var.value();
    4. //process
    5. }

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

    1)定义自定义数据类型

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

    1. typedef struct _TEST
    2. {
    3. int a;
    4. int b;
    5. bool c;
    6. }TEST;

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

    qRegisterMetaType("TEST");

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

    3)定义相应的signal和slot

    1. signals:
    2. void sgnParams(TEST test);
    3. //other classes
    4. slots:
    5. void slotParams(TEST test);

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

    4)发送

    1. TEST test;
    2. test.a = 300;
    3. test.b = 200;
    4. test.c = false;
    5. Q_EMIT sgnParams(test);

    发送直接赋值即可。

    5)接收

    qDebug() << test.a << test.b << test.c;
    

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

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

  • 相关阅读:
    [Spring Cloud] Open Feign 使用
    第十五届全国大学生数学竞赛初赛试卷解析
    Ubuntu编译 PCL 1.13.1 详细流程
    Redis过期键的删除策略即持久化机制
    springboot 部署到 weblogic 中 jar 包冲突
    构建快速、安全、可扩展的静态站点:终极指南
    信号相干解调
    Tomcat8 WEB-INF更改class后 用manager实现reload
    计算机毕业论文java毕业设计选题源代码基于javaweb实现的客运站网上售票系统
    QT刷题系统
  • 原文地址:https://blog.csdn.net/propor/article/details/133643880