当指针值在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之前无法按预期和观察到的那样进行。
答案 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*
会是一种更好而直接的解决方案?