QT信号和槽以结构体为参数传递复杂数据

news/2024/5/18 21:51:06 标签: qt, html, signal, 文档, struct
htmledit_views">

http://blog.csdn.net/storylsl/article/details/7240412

 

 

QT信号和槽以结构体为参数传递复杂数据

634人阅读 评论(0) 收藏 举报
 QT 的信号和槽机制能十分方便的用来传输数据,但是如果数据种类比较多,分类比较多的时候,就需要更好地更高效的来传递数据的方法。以结构体作为参数是个很不错的选择。这几天写的程序正好需要以结构体来作为参数,但是网上搜的资料很少,讲的也不详细,我解决了问题后整理了一下,希望给有同样需求的同学一点帮助

1.首先是结构体的使用,需要使用Q_DECLARE_METATYPE宏
如:

html">
[html] view plain copy print ?
  1. struct DataStruct  
  2. {  
  3.     QByteArray DstAddr;  
  4.     QByteArray ClusterId;  
  5.     int DstEndpoint;  
  6.     int DeviceEndpoint;  
  7.     int CommandID;  
  8.     QByteArray AttributeID;  
  9.     int DataType;  
  10. };  
  11. Q_DECLARE_METATYPE(DataStruct)  //这个宏具体的用法参考帮助文档  
html">struct DataStruct
{
    QByteArray DstAddr;
    QByteArray ClusterId;
    int DstEndpoint;
    int DeviceEndpoint;
    int CommandID;
    QByteArray AttributeID;
    int DataType;
};
Q_DECLARE_METATYPE(DataStruct)  //这个宏具体的用法参考帮助文档


 

2.然后是把该结构体封装如一个QVariant

html">
[html] view plain copy print ?
  1. DataStruct askData;  
  2. QVariant DataVar;  
  3. DataVar.setValue(askData);  
html">    DataStruct askData;
    QVariant DataVar;
    DataVar.setValue(askData);

  
3.然后是对QVariant进行注册,因为信号和槽的参数类型并不认识QVariant

   

html">
[html] view plain copy print ?
  1. qRegisterMetaType<QVariant>("QVariant"); //写在构造函数里  
html"> qRegisterMetaType<QVariant>("QVariant"); //写在构造函数里


 

4.然后这个类中的信号就可以将QVariant作为参数了

html">
[html] view plain copy print ?
  1. signals:  
  2.     void send_askData(QVariant dataVar);  
html">signals:
    void send_askData(QVariant dataVar);

5.接收类中,由于包含了发射类的头文件,所以不必再对结构体进行定义

html">
[html] view plain copy print ?
  1. connect(readThread,SIGNAL(send_askData(QVariant)),this,SLOT(AF_DATA_REQUEST(QVariant)));  
  2. 在槽函数中  
  3. DataStruct askData;  
  4. askData = dataVar.value<DataStruct>();  
html">    connect(readThread,SIGNAL(send_askData(QVariant)),this,SLOT(AF_DATA_REQUEST(QVariant)));
    在槽函数中
    DataStruct askData;
    askData = dataVar.value<DataStruct>();

    这样就可以提取出容器内的结构体数据,并进行操作了,这对需要传输比较复杂的数据时效果比较好


http://www.niftyadmin.cn/n/790132.html

相关文章

SpringBoot进行事务管理并且手动事务回滚

spring boot都是在SSM整合的基础上进行的 首先添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>添加事务管理的注解(没变化) 添加依赖成功后&#xff0…

python 扫描路径下的所有文件

http://blog.csdn.net/longshen747/article/details/17194259 主要是参考了用来处理对某个目录下的所有文件进行操作,代码写的挺好的.转载于:https://www.cnblogs.com/hope100/p/4317260.html

Linux常用命令之网络命令(八)

[b][colorolive][sizemedium]一.设置固定IP 先说一下临时设置IP的方法&#xff1a; ifconfig eth0 192.168.12.51 #重启机器或者重启network马上失效配置网卡的IP地址&#xff1a; ifconfig eth0 192.168.0.1 netmask 255.255.255.0 配置网卡的子接口 ifconfig eth0:0 192.168.…

SpringBoot使用过滤器,拦截器(基于AOP),监听器(都是基于注解的)

在Springboot整合SSM的基础上进行 简单介绍 SSM就应该用过下面三个了&#xff0c;我这主要说一下它们的用途 过滤器&#xff1a;对web服务器管理所有的web资源&#xff0c;主要是对用户的一些请求进行一些预处理&#xff0c;并在服务器响应后再进行预处理&#xff0c;返回给用户…

网路字节顺序和主机字节顺序

http://www.cctry.com/thread-1001-1-1.html 网路字节顺序和主机字节顺序 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序 最常见的有两种 1&#xff0e; Little endian&#xff1a;将低序字节存储在起始地址 2&#xff0e; Big endian&am…

留学生 电脑安全与维护手册 (留学须知)

留学生 电脑安全与维护手册 “自从1840年鸦片战争失败那时起&#xff0c;先进的中国&#xff0c;经过千辛万苦&#xff0c;向西方国家寻求真理”&#xff08;***语&#xff09;。为了国家的繁荣、名族的复兴&#xff0c;一批批的炎黄儿女纷纷的踏出国门——西去或东渡…… 我在…

Linux常用命令之文件系统管理(九)

[b][colorgreen][sizemedium]一.文件系统构成 /usr/bin 、/bin&#xff1a;存放所有用户都可以执行的命令 /usr/sbin 、/sbin&#xff1a;存放只有root用户可以执行的命令 /home&#xff1a;用户缺省宿主目录 /proc&#xff1a;虚拟文件目录&#xff0c;存放当前进程信息 /dev&…

VC调试篇

http://www.kuqin.com/developtool/20080504/7816.html VC调试篇 设置 为了调试一个程序&#xff0c;首先必须使程序中包含调试信息。一般情况下&#xff0c;一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息&#xff0c;但是是不是Debug版本并不是程序…