我有一个工作线程中的对象,它需要将数据传递回主线程中的控制器。有几个字段要移动,所以我更喜欢使用结构体来实现这一点。Qt文档清楚地表明,使用排队连接的自定义类型,我需要使用Q_DECLARE_METATYPE和qRegisterMetaType。
该结构在我的工作类中声明,它位于命名空间内。在头文件中,在类声明之后,在名称空间之外,我包含了Q_DECLARE_METATYPE(myNamespace::myWorkerClass::myStruct)
。我不确定qRegisterMetaType属于哪里,所以现在我把它放在控制器的构造函数-qRegisterMetaType(myWorkerClass::myStruct)
。
(我也尝试了其他几种配置,但都没有帮助)。在每种情况下,程序都可以正常编译,但无法执行信号中的插槽,输出QObject::connect: Cannot queue arguments of type 'myStruct'
。
所以看起来有些事情我不明白。有线索吗?
如文档所述:
在排队信号和槽位连接中使用T类型,qRegisterMetaType()必须在第一个连接建立之前调用建立。
所以如果你把寄存器放在构造函数中,你必须实例化你的类一次,然后建立连接。
注册类型的常用方法是在main中或使用静态函数寄存器。
解决方案1:
somewhere.h
void registryCustonType()
{
qRegisterMetaType(myWorkerClass::myStruct);
// other registry for custom classes.
}
main.cpp
int main()
{
registryCustomTypes();
// ...
}
解决方案2:
mystruct.cpp
namespace {
static const bool reg = qRegisterMetaType(myWorkerClass::myStruct);
}
我通常使用后者,它允许我不显式指定任何寄存器函数。