Qt 将QVariant转换为float

Qt 将QVariant转换为float,qt,qvariant,Qt,Qvariant,我很难从QVariant中获取浮点值 我调用一个函数,它返回一个QVariant,但当我将其转换为浮点值时,如下所示: float resf = result.toFloat(); 结果始终为0.0000000。 这不是我期望的结果 QVariant本身不是空的: 它包含我需要的数据 当我获取最后的十六进制值并将其输入IEEE 754转换器时,我得到了我预期的结果: 0x411a8ad8 = 9.658897 为什么结果不是我所期望的?(因为QVariant中的每个元素都可以存储2字节,例

我很难从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
    
    bool bValid = true;
    result.toFloat(&bValid);    =>bValid = false
    bValid = true;
    ba.toFloat(&bValid);        =>bValid = false  
    
    Edit2:根据aatwo的建议:

    bool convert = false;
    convert = result.canConvert<float>();         =>true
    QVariant::Type type = result.type();          =>ByteArray
    QString str_typename = result.typeName();     =>QByteArray
    
    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());
    
    也不会返回我期望的值:

    0x411a8ad8 = 9.658897
    

    但我让它工作:

    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
    

    quint32 temp=((char)ba[0]根据提供的信息,浮点值以原始数据形式存储在QVariant中的QByteArray中

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

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

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

    另请注意:在额外的代码片段中,您试图使用QByteArray::toFloat函数将QByteArray数据转换为浮点。您应该知道,此函数仅适用于浮点的字符串表示形式,而不适用于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));
    
    QVariant result=pDatapoint->property(“RawValue”);
    QByteArray ba=result.toByteArray();
    
    quint32 temp=((char)ba[0]可以使用“value”方法执行,如下所述


    依此类推。所有函数都在。

    尝试检查QVariant::type()和QVariant::canConvert()的结果。尽管您检查了原始数据,但我猜QVariant不知道它有可以转换为浮点的内容。如果您使用QVariant::toFloat(bool*)重载bool表示成功还是失败?听起来它可能失败了,可能是因为变量不包含浮点类型。在第二段代码中,底层数据类型看起来实际上是一个QByteArray,在这种情况下,您需要知道浮点是如何存储的,例如,它基本上是一个字符串表示吗浮点数的变化?或原始浮点数数据?向变量返回函数显示代码。它被破坏了。这就是问题所在。不是在您显示的代码中。@KubaOber我不能提供代码。它是一个COM对象的接口。一个不能按值返回浮点数的COM对象?他们在想什么:(数据来自COM函数)(返回类型变量)。Qt以QVariant的形式提供数据,对此我无能为力。我尝试了你的建议(见第一篇文章),但没有得到预期的结果。尽管你给我指出了正确的方向,我还是找到了一个非常类似的方法,正如你建议的(也见第一篇文章)。谢谢你的帮助!