2016-11-04 51 views
-1

我有一些麻煩讓我的浮點值超出QVariant。將QVariant轉換爲浮點數

我調用一個函數,它返回一個的QVariant,但是當我將其轉換爲一個浮點值,就像這樣:

float resf = result.toFloat(); 

結果總是0.0000000。 這不是我期望的結果。

的的QVariant本身不是空的:

QVariant to float

它包含了我所需要的數據。

當我走過去的十六進制值,並將其送至一個IEEE 754轉換器,我得到的結果,我預計:

0x411a8ad8 = 9.658897 
  1. 爲什麼結果不是我期望? (因爲每個的QVariant元素可以存儲2個字節例如0x0041,所以轉換失敗?)
  2. 我如何得到我的浮點值?

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

也不能返回我的預期值:

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 

謝謝!

+0

嘗試檢查QVariant :: type()和QVariant :: canConvert()的結果。儘管您對原始數據進行了檢查,但我的猜測是QVariant並不知道它有一些可以轉換爲浮點數的東西。 – goug

+0

如果使用QVariant :: toFloat(bool *)重載,bool是否指示成功或失敗?聽起來像它可能失敗,可能是因爲變體不包含浮點類型。在第二個代碼片段中,它看起來像底層數據類型實際上是一個QByteArray,在這種情況下,您需要知道float是如何存儲的,例如它基本上是float的字符串表示形式?還是原始的浮動數據? – aatwo

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

根據該信息提供的浮點值被存儲在它的原始數據形式的的QByteArray內的QVariant內部。

首先值得注意的是,這將是更簡單,更容易地將裏面的QVariant浮點值存儲爲float類型。這不僅可以讓你的代碼更簡單,而且還可以避免與數據轉換和平臺排序有關的可能的跨平臺問題。

無論如何,你應該能夠通過執行類似下面從變異提取您的浮點值:

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

還要注意:在你的代碼片段外,你試圖使用的QByteArray :: toFloat函數將您的QByteArray數據轉換爲浮點數。您應該知道,此函數僅適用於浮點數的字符串表示形式,不適用於您的QByteArray包含原始浮點數據的情況。 QByteArray :: toFloat和QVariant :: toFloat都有可選的bool參數來指示轉換成功/失敗。值得使用,以幫助通知這樣的問題!

+0

數據來自一個COM函數(返回類型爲VARIANT)Qt提供的數據爲QVariant,我無能爲力,我嘗試了你的建議(見第一篇文章),但我無法獲得結果如預期的那樣,儘管如此,你指向了正確的方向,我發現了一個非常類似的方式,正如你所建議的那樣(另見第一篇文章),謝謝你的幫助! – snucker