zoukankan      html  css  js  c++  java
  • Qt 信号槽收发自定义类/自定义结构体的2种方法

    想要发射信号时,携带自定义的class或者struct,必须要做一下处理,否则编译时不会报错,但运行时会出错。

    假设我们自定义了一个结构体:

    1 typedef struct
    2 {
    3     ...//
    4     ...//
    5 }Frame7E;

    如果想要这么用:

    1 Frame7E frame;
    2 ...//填充frame
    3 emit sendFrame(frame);

    那么必须使用以下两种方法之一。

    方法1:使用宏:Q_DECLARE_METATYPE

    该方法的原理是使得QVariant类支持我们自定义的类型,而QT的信号槽是支持发射QVariant类型数据的,然后我们可以用QVariant封装这个自定义类/结构,然后emit 出去QVariant类型的变量。

     1   #include <qmetatype.h>
     2   //发射端
     3   Frame7E frame;
     4   ...//填充frame
     5   QVariant var;
     6   var.setValue(frame); // copy s into the variant
     7   emit sendFrame(var);//发QVariant类型的信号
     8  
     9  
    10   接收端
    11   // retrieve the value
    12   Frame7E s2 = var.value<Frame7E>();//QVariant 转换为 Frame7E 

    方法2:使用qRegisterMetaType函数使得QT的信号槽支持自定义类型

    1 #include <QMetaType>
    2  
    3 //注册自定义类型,使QT的信号槽支持我们的类型
    4 qRegisterMetaType<Frame7E>("Frame7E");//参数无所谓,建议带上同名字符串参数

    注册完之后,就可以正常使用信号槽了。

    需要注意以下几点:

    1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
    2、注册方法:在当前类的顶部包含:#include <QMetaType>,构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass");
    3、Myclass的引用类型需单独注册:qRegisterMetaType<MyClass>("Myclass&");

  • 相关阅读:
    java.io.FileNotFoundException: D:workspacegbrmWebRoot空缺职位列表20140414093026.xls (系统找不到指定的路径。)
    select * from (select t.*,rownum as rowno from (select * from j_kqzw where 1=1 and DEADLINE >='2013-04-14' and DEADLINE <='2014-04-14' ) t)where rown
    hibernate的映射文件字段长度和数据库里面的字段长度
    八门神器
    计算机
    c语言
    捕鱼达人
    桂林力港网络科技有限公司
    cocos2d-x
    3gp 编辑
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15769722.html
Copyright © 2011-2022 走看看