我在工作线程中有一个对象,该对象需要将数据传递回主线程中的控制器。有几个要移动的字段,所以我更喜欢使用结构来执行此操作。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] 删除。
我来说两句