注册用于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:

某处

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);
}

我通常使用后者,这使我不必显式指定任何寄存器功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章