c++ - 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 之前这不能按预期工作和观察到的。
解决方案
您不需要 register void*
,而是使用元类型QMetaType::VoidStar。
请注意,要注册元类型SomeCustomType*
,您需要使用别名。
using SomeCustomTypePtr = SomeCustomType*;
Q_DECLARE_METATYPE(SomeCustomTypePtr)
qRegisterMetaType<SomeCustomTypePtr>();
推荐阅读
- node.js - 将时间戳列添加到 Node.js Google Cloud 函数中的文件
- javascript - 有没有更好的方法来检查 Javascript 中是否存在变量?
- javascript - Tinymce颜色按钮问题
- picker - SwiftUI - 在 HStack 中并排放置两个选择器不会调整选择器的大小
- java - 如何在 Spring Boot 中使用 Dozer 并排除某些属性
- python - 导入由变量中的字符串命名的文件
- c# - C# 将 XML 反序列化为自定义类
- sql - 在调试模式下成功导出到 csv,但在运行时模式下失败
- python - python pandas:根据重复的索引列将行旋转到列
- python - 什么是应用 lambda 以更快地处理大型数据帧的替代方案?