我有一些麻烦让我的浮点值超出QVariant。将QVariant转换为浮点数
我调用一个函数,它返回一个的QVariant,但是当我将其转换为一个浮点值,就像这样:
float resf = result.toFloat();
结果总是0.0000000。 这不是我期望的结果。
的的QVariant本身不是空的:
它包含了我所需要的数据。
当我走过去的十六进制值,并将其送至一个IEEE 754转换器,我得到的结果,我预计:
0x411a8ad8 = 9.658897
- 为什么结果不是我期望? (因为每个的QVariant元素可以存储2个字节例如0x0041,所以转换失败?)
- 我如何得到我的浮点值?
EDIT1:goug的建议后:
bool convert = false;
convert = result.canConvert<float>(); =>true
QVariant::Type type = result.type(); =>ByteArray
QString str_typename = result.typeName(); =>QByteArray
但结果还是一样:
QByteArray ba = result.toByteArray();
float fl = ba.toFloat(); =>fl = 0.00000000000
EDIT2:经过aatwo的建议:
bool bValid = true;
result.toFloat(&bValid); =>bValid = false
bValid = true;
ba.toFloat(&bValid); =>bValid = false
因此,两次转换均失败,即使“canConvert”返回“true”。
尝试:
QByteArray floatByteArray = result.toByteArray();
float floatValue = *(float*)(floatByteArray.data());
也不能返回我的预期值:
但我得到它的工作:
quint32 temp = ((char)ba[0] << 24) + ((char)ba[1] << 16) + ((char)ba[2] << 8) + (char)ba[3];
float* out = reinterpret_cast<float*>(&temp); =>out = 9.658897
谢谢!
尝试检查QVariant :: type()和QVariant :: canConvert()的结果。尽管您对原始数据进行了检查,但我的猜测是QVariant并不知道它有一些可以转换为浮点数的东西。 – goug
如果使用QVariant :: toFloat(bool *)重载,bool是否指示成功或失败?听起来像它可能失败,可能是因为变体不包含浮点类型。在第二个代码片段中,它看起来像底层数据类型实际上是一个QByteArray,在这种情况下,您需要知道float是如何存储的,例如它基本上是float的字符串表示形式?还是原始的浮动数据? – aatwo
显示变体返回函数的代码。它坏了。这就是问题所在。不在你显示的代码中。 –