将QVariant转换为float



我有一些麻烦得到我的浮动值的QVariant。

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

float resf = result.toFloat();

结果总是0.0000000。那不是我所期望的结果。

QVariant本身不是空的:

QVariant to float

它包含了我需要的数据。

当我把最后的十六进制值输入到IEEE 754转换器时,我得到了我预期的结果:

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

Edit1: After goug's suggestion:

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

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

谢谢!

根据提供的信息,浮点值以其原始数据形式存储在QVariant中的QByteArray中。

首先值得注意的是,将float值存储在QVariant中作为float类型要简单得多。这不仅会使您的代码更简单,而且还可以避免与数据转换和平台端序相关的可能的跨平台问题。

无论如何,您应该能够通过执行以下操作从变量中提取浮点值:

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

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

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

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

可以使用这里描述的'value'方法。

QVariant valQVar={12.22f};
float valFloat = valQVar.value<float>();

另外,对于一些类型,您可以调用诸如

之类的方法
 valQVar.toBool();
 valQVar.toChar();
 valQVar.toDouble();

以此类推。

相关内容

  • 没有找到相关文章

最新更新