将QVariant转换为float

时间:2016-11-04 20:45:11

标签: qt qvariant

我从QVariant中获取浮动值时遇到了一些麻烦。

我调用一个函数,它返回一个QVariant,但当我将它转换为浮点值时,如下所示:

float resf = result.toFloat();

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

QVariant本身并不是空的:

QVariant to float

它包含我需要的数据。

当我获取最后的十六进制值并将它们提供给IEEE 754转换器时,我得到了我期望的结果:

0x411a8ad8 = 9.658897
  1. 为什么结果不是我预期的? (因为QVariant中的每个元素都可以存储2个字节,例如 0x0041 ,所以转换失败了?)
  2. 如何获得浮动值?
  3. 编辑1:在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
    

    编辑2:经过一段时间的建议:

    bool bValid = true;
    result.toFloat(&bValid);    =>bValid = false
    bValid = true;
    ba.toFloat(&bValid);        =>bValid = false  
    

    所以,两次转换都失败了,甚至&#34; canConvert&#34;返回&#34; true&#34;。

    尝试:

    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
    

    谢谢!

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

答案 2 :(得分:1)

可以使用描述为here.的'value'方法进行操作

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

此外,对于几种类型,您可以调用诸如

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

以此类推。所有功能都在documentation中。