c++ - QVariant 包装指针在 QML 中变为 null

标签 c++ qt pointers qml qvariant

当指针值跨越 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/

相关文章:

c++ - 再次关于 typename 和 template 关键字

c - C 中的指针类似于数组,但指针更有用

c - 指针大小、方法内的 32 位与 64 位指针大小以及方法的返回值

c++ - 为什么 'unbounded_array' 比 'vector' 更有效?

c++ - Qt 的 CUDA 包装器

c++ - 在 C++11 中,虚函数能否通过 move 语义有效地返回一个大值?

qt - 在 RPi 2 上交叉编译 Qt 5.6 失败( fatal error : bcm_host. h:没有这样的文件或目录)

c++ - 如何通过Qt中的几个类对象发出信号?

c++ - 从以 QStringListModel 作为模型的 QListview 中删除单个项目

c++ - char * (*arr)[2 ] 和 char **array[2] 有何不同?