首页 > 解决方案 > QVariant 包装的指针在 QML 中变为空

问题描述

当指针值在 C++ 和 QML 世界之间超越时,似乎出现了问题。我正在使用普通的 old fromValue()andvalue()转换为和 from void *,只要变体保持在 C++ 端,它就可以按预期工作。

当它返回到 QML 时,它现在解析为null,当传递回 C++ 时,变体类型从void *to更改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 时,类型信息变得混乱,在 C++ 中,变体是 type qulonglong,从QML 现在是 a double,因此怀疑它可能会舍入某些东西并弄乱指针值。

编辑 2:请注意,问题不是关于推荐实践,而是关于为什么在达到 QML 之前这不能按预期工作和观察到的。

标签: c++qtpointersqmlqvariant

解决方案


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

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

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

推荐阅读