当指针值跨越 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 时,类型信息变得困惑,在 C++ 中,变体的类型是 qulonglong
,从 QML 返回它现在是一个 double
,因此怀疑它可能会舍入某些东西并弄乱指针值。
编辑 2:请注意,问题不是关于推荐做法,而是关于为什么这在达到 QML 之前没有按预期和观察到的那样工作。
最佳答案
您不需要注册 void*
,而是使用元类型 QMetaType::VoidStar .
请注意,要注册元类型SomeCustomType*
,您需要使用别名。
using SomeCustomTypePtr = SomeCustomType*;
Q_DECLARE_METATYPE(SomeCustomTypePtr)
qRegisterMetaType<SomeCustomTypePtr>();
关于c++ - QVariant 包装指针在 QML 中变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56167406/