因项目需要,在线程中进行数据解析结束之后,需要将处理后的数据值通过信号的方式传递出来。
这个值是一个自定义的类型,里面定义了解析之后的格式。
typedef struct test_type
{
//......
}TEST_TYPE;
然后就是连接信号槽了,如下:
connect(pThread, SIGNAL(dataResult(TEST_TYPE)), this, SLOT(onDataResult(TEST_TYPE)));
然后发现槽函数死活进不去,在查阅资料之后,找到了两种解决方法:
- 更改连接参数
- 注册元类型
1. 更改连接参数为Qt::DirectConnection —— 不推荐
这是第一种方法,就是将connect函数的第五个参数设置为Qt::DirectConnection直连模式。
connect(pThread, SIGNAL(dataResult(TEST_TYPE)), this, SLOT(onDataResult(TEST_TYPE)), Qt::DirectConnection);
结果发现 通过这种方法槽函数是可以进入的,但是有些时候的数据有点紊乱。
并且Qt官方也不推荐这种方式。
2. 注册元类型 —— 极力推荐
这种方式极力推荐。
槽函数未响应的原因,在于识别不了这个类型,Qt的信号和槽的通信都是通过元类型的方式进行的,在这种情况下,如果想要使用自定义的类型,那么就需要将其注册为元类型,如果不注册的话,因为识别不了这个类型,就会导致槽函数一直进不去。
注册的方式也很简单,可以分为两块:
- 通过Q_DECLARE_METATYPE宏先将自定义类型描述出来;
- 然后使用qRegisterMetaType将这个类型注册为元类型。
注意使用qRegisterMetaType的时候需要包含<QMetaType>头文件。
代码如下:
// 首先声明元类型
typedef struct test_type
{
//......
}TEST_TYPE;
Q_DECLARE_METATYPE(TEST_TYPE)
// 而后在构造函数中注册此类型(习惯性在构造函数中进行)
#include <QMetaType>
qRegisterMetaType<TEST_TYPE>("TEST_TYPE");
然后就可以正常使用了。