将 QVariant 转换为浮点数
Convert QVariant to float
我在从 QVariant 中获取浮点值时遇到一些问题。
我调用了一个函数,它 returns 是一个 QVariant,但是当我将它转换为浮点值时,如下所示:
float resf = result.toFloat();
结果总是 0.0000000。
这不是我期望的结果。
QVariant 本身不为空:
QVariant to float
它包含我需要的数据。
当我获取最后的十六进制值并将它们提供给 IEEE 754 转换器时,我得到了预期的结果:
0x411a8ad8 = 9.658897
- 为什么结果不是我预期的? (因为 QVariant 中的每个元素可以存储 2-Bytes e.g. 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" returns "true".
正在尝试:
QByteArray floatByteArray = result.toByteArray();
float floatValue = *(float*)(floatByteArray.data());
也returns不是我预期的值:
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 内。
首先值得注意的是,将浮点值作为浮点类型存储在 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));
可以使用 'value' 方法,描述为 here.
QVariant valQVar={12.22f};
float valFloat = valQVar.value<float>();
此外,对于几种类型,您可以调用方法,例如
valQVar.toBool();
valQVar.toChar();
valQVar.toDouble();
等等。所有函数都在documentation.
我在从 QVariant 中获取浮点值时遇到一些问题。
我调用了一个函数,它 returns 是一个 QVariant,但是当我将它转换为浮点值时,如下所示:
float resf = result.toFloat();
结果总是 0.0000000。 这不是我期望的结果。
QVariant 本身不为空:
QVariant to float
它包含我需要的数据。
当我获取最后的十六进制值并将它们提供给 IEEE 754 转换器时,我得到了预期的结果:
0x411a8ad8 = 9.658897
- 为什么结果不是我预期的? (因为 QVariant 中的每个元素可以存储 2-Bytes e.g. 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" returns "true".
正在尝试:
QByteArray floatByteArray = result.toByteArray();
float floatValue = *(float*)(floatByteArray.data());
也returns不是我预期的值:
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 内。
首先值得注意的是,将浮点值作为浮点类型存储在 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));
可以使用 'value' 方法,描述为 here.
QVariant valQVar={12.22f};
float valFloat = valQVar.value<float>();
此外,对于几种类型,您可以调用方法,例如
valQVar.toBool();
valQVar.toChar();
valQVar.toDouble();
等等。所有函数都在documentation.