QVariant包装的指针在QML中变为空

时间:2019-05-16 11:21:57

标签: c++ qt pointers qml qvariant

当指针值在C ++和QML世界之间超越时,似乎出了点问题。我正在使用普通的旧fromValue()value()来回转换void *,只要变体停留在C ++端,它就可以按预期工作。

返回QML之后,它现在解析为null,并在传递回C ++时,变体类型从void *更改为std::nullptr_t,并且值为空

returning 0x3ba5b10 // created
converting to qvariant 0x3ba5b10 // converting
converted QVariant(void*, 0x3ba5b10) 0x3ba5b10 // now variant, testing value() - all good
qml: null // in qml
received QVariant(std::nullptr_t, (nullptr)) 0x0 // back in c++

我正在使用:

Q_DECLARE_METATYPE(void*)
qRegisterMetaType<void*>();

关于这里发生的事情有什么线索吗?

编辑:它变得更加奇怪,我通过将指针值转换为64位uint并返回来使其工作,但是在过渡到QML时,类型信息变得混乱,在C ++中,变体的类型为{ {1}},从QML返回现在是qulonglong,因此怀疑它可能会四舍五入并弄乱指针值。

编辑2:请注意,问题不在于推荐做法,而是关于为什么这样做在达到QML之前无法按预期和观察到的那样进行。

2 个答案:

答案 0 :(得分:3)

您不需要注册void*,而使用元类型QMetaType::VoidStar

请注意,要注册元类型SomeCustomType*,您需要使用别名。

using SomeCustomTypePtr = SomeCustomType*;
Q_DECLARE_METATYPE(SomeCustomTypePtr)
qRegisterMetaType<SomeCustomTypePtr>();

答案 1 :(得分:1)

甚至不可能做这样的声明?

根据Q_DECLARE_METATYPE(Type)上的官方文档:

  

此宏使Type知道类型QMetaType,只要它提供公共默认构造函数,公共副本构造函数和公共析构函数即可。需要使用类型Type作为QVariant中的自定义类型。

     

此宏要求Type在使用时为完全定义的类型。

奇怪的是,这至少在C ++部分有效。

您是否认为声明您的类型指针而不是void*会是一种更好而直接的解决方案?