Qvariant包装指针在QML中变为null

QVariant wrapped pointers turn to null in QML

本文关键字:null QML 包装 指针 Qvariant      更新时间:2023-10-16

当指针值超越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*