注册一个Struct用于Qt排队连接



我有一个工作线程中的对象,它需要将数据传递回主线程中的控制器。有几个字段要移动,所以我更喜欢使用结构体来实现这一点。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);
}

我通常使用后者,它允许我不显式指定任何寄存器函数。

相关内容

  • 没有找到相关文章