当指针值超越C 和QML世界之间,似乎出了问题。我使用普通的旧fromValue()
和value()
来转换为void *
,并且只要变体留在C 方面,它确实可以正常工作。
返回QML的那一刻,现在就解散到null
,并且当传递回C 时,变体类型从void *
更改为std::nullptr_t
,值为NULL。
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时,类型INFO被弄乱了,在C 中,变体是类型qulonglong
的。,从QML到达现在是double
,因此怀疑它可能会绕过某些东西并弄乱指针值。
编辑2:请注意,问题不是要推荐实践,而是要在达到QML之前预期和观察到的原因。
您不需要注册void*
,而是使用metatype qmetatype :: voidstar。
请注意,要注册Metatype SomeCustomType*
,您需要使用别名。
using SomeCustomTypePtr = SomeCustomType*;
Q_DECLARE_METATYPE(SomeCustomTypePtr)
qRegisterMetaType<SomeCustomTypePtr>();
甚至无法进行此类声明?
根据q_declare_metatype上的官方文档(类型(:
此宏使
QMetaType
类型CC_12提供了公共默认构造函数,公共拷贝构造函数和公共驱动器。需要将类型Type
用作QVariant
中的自定义类型。此宏要求该类型是在使用时的完全定义类型。
听起来很奇怪,至少在C 部分中起作用。
您是否认为声明您的类型指针而不是void*
?