2016-11-04 915 views
-1

我有一些麻烦让我的浮点值超出QVariant。将QVariant转换为浮点数

我调用一个函数,它返回一个的QVariant,但是当我将其转换为一个浮点值,就像这样:

float resf = result.toFloat(); 

结果总是0.0000000。 这不是我期望的结果。

的的QVariant本身不是空的:

QVariant to float

它包含了我所需要的数据。

当我走过去的十六进制值,并将其送至一个IEEE 754转换器,我得到的结果,我预计:

0x411a8ad8 = 9.658897 
  1. 为什么结果不是我期望? (因为每个的QVariant元素可以存储2个字节例如0x0041,所以转换失败?)
  2. 我如何得到我的浮点值?

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()); 

也不能返回我的预期值:

QByteArray To Float

但我得到它的工作:

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 

谢谢!

+0

尝试检查QVariant :: type()和QVariant :: canConvert()的结果。尽管您对原始数据进行了检查,但我的猜测是QVariant并不知道它有一些可以转换为浮点数的东西。 – goug

+0

如果使用QVariant :: toFloat(bool *)重载,bool是否指示成功或失败?听起来像它可能失败,可能是因为变体不包含浮点类型。在第二个代码片段中,它看起来像底层数据类型实际上是一个QByteArray,在这种情况下,您需要知道float是如何存储的,例如它基本上是float的字符串表示形式?还是原始的浮动数据? – aatwo

+1

显示变体返回函数的代码。它坏了。这就是问题所在。不在你显示的代码中。 –

回答

2

这里是我的最终解决方案,以及我在这里收集的所有信息。

QVariant result = pDatapoint->property("RawValue"); 
QByteArray ba = result.toByteArray(); 
quint32 temp = ((char)ba[0] << 24) + ((char)ba[1] << 16) + ((char)ba[2] << 8) + (char)ba[3]; 
float result_float; 
std::memcpy(&result_float, &temp, sizeof(float)); 
4

根据该信息提供的浮点值被存储在它的原始数据形式的的QByteArray内的QVariant内部。

首先值得注意的是,这将是更简单,更容易地将里面的QVariant浮点值存储为float类型。这不仅可以让你的代码更简单,而且还可以避免与数据转换和平台排序有关的可能的跨平台问题。

无论如何,你应该能够通过执行类似下面从变异提取您的浮点值:

QByteArray floatByteArray = floatVariant.toByteArray(); 
float floatValue = *(float*)(floatByteArray .data()); 

还要注意:在你的代码片段外,你试图使用的QByteArray :: toFloat函数将您的QByteArray数据转换为浮点数。您应该知道,此函数仅适用于浮点数的字符串表示形式,不适用于您的QByteArray包含原始浮点数据的情况。 QByteArray :: toFloat和QVariant :: toFloat都有可选的bool参数来指示转换成功/失败。值得使用,以帮助通知这样的问题!

+0

数据来自一个COM函数(返回类型为VARIANT)Qt提供的数据为QVariant,我无能为力,我尝试了你的建议(见第一篇文章),但我无法获得结果如预期的那样,尽管如此,你指向了正确的方向,我发现了一个非常类似的方式,正如你所建议的那样(另见第一篇文章),谢谢你的帮助! – snucker