我有一些麻煩讓我的浮點值超出QVariant。將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
但結果還是一樣:
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());
也不能返回我的預期值:
但我得到它的工作:
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 :: type()和QVariant :: canConvert()的結果。儘管您對原始數據進行了檢查,但我的猜測是QVariant並不知道它有一些可以轉換爲浮點數的東西。 – goug
如果使用QVariant :: toFloat(bool *)重載,bool是否指示成功或失敗?聽起來像它可能失敗,可能是因爲變體不包含浮點類型。在第二個代碼片段中,它看起來像底層數據類型實際上是一個QByteArray,在這種情況下,您需要知道float是如何存儲的,例如它基本上是float的字符串表示形式?還是原始的浮動數據? – aatwo
顯示變體返回函數的代碼。它壞了。這就是問題所在。不在你顯示的代碼中。 –