Qt传递自定义类型时槽函数不响应的原因及解决方案

因项目需要,在线程中进行数据解析结束之后,需要将处理后的数据值通过信号的方式传递出来。
这个值是一个自定义的类型,里面定义了解析之后的格式。

typedef struct test_type
{
	//......
}TEST_TYPE;

然后就是连接信号槽了,如下:

connect(pThread, SIGNAL(dataResult(TEST_TYPE)), this, SLOT(onDataResult(TEST_TYPE)));

然后发现槽函数死活进不去,在查阅资料之后,找到了两种解决方法:

  1. 更改连接参数
  2. 注册元类型

1. 更改连接参数为Qt::DirectConnection —— 不推荐

这是第一种方法,就是将connect函数的第五个参数设置为Qt::DirectConnection直连模式。

connect(pThread, SIGNAL(dataResult(TEST_TYPE)), this, SLOT(onDataResult(TEST_TYPE)), Qt::DirectConnection);

结果发现 通过这种方法槽函数是可以进入的,但是有些时候的数据有点紊乱

并且Qt官方也不推荐这种方式。

2. 注册元类型 —— 极力推荐

这种方式极力推荐。
槽函数未响应的原因,在于识别不了这个类型,Qt的信号和槽的通信都是通过元类型的方式进行的,在这种情况下,如果想要使用自定义的类型,那么就需要将其注册为元类型,如果不注册的话,因为识别不了这个类型,就会导致槽函数一直进不去。

注册的方式也很简单,可以分为两块:

  1. 通过Q_DECLARE_METATYPE宏先将自定义类型描述出来;
  2. 然后使用qRegisterMetaType将这个类型注册为元类型。

注意使用qRegisterMetaType的时候需要包含<QMetaType>头文件。
代码如下:

// 首先声明元类型
typedef struct test_type
{
	//......
}TEST_TYPE;
Q_DECLARE_METATYPE(TEST_TYPE)
// 而后在构造函数中注册此类型(习惯性在构造函数中进行)
#include <QMetaType>

qRegisterMetaType<TEST_TYPE>("TEST_TYPE");

然后就可以正常使用了。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值