2016-11-04 17 views
-1

QVariantから浮動小数点値を取得する際に問題があります。QVariantを浮動小数点に変換する

私はQVariantを返す関数を呼び出しますが、私はこのように、float値に変換する場合:

float resf = result.toFloat(); 

結果は常に0.0000000です。 それは私が期待した結果ではありません。

QVariant自体は空ではありません。

QVariant to float

それは私が必要とするデータが含まれています。

私は最後の16進数値を取り、IEEE 754コンバータにそれらを養う、私は結果は私が期待してしまった:

0x411a8ad8 = 9.658897 
  1. はなぜ結果ではありません、私は予想1? (QVariantの各要素は0x0041のように2バイトを格納できるため、変換に失敗しましたか?)
  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は成功または失敗を示しますか?恐らく、おそらく失敗しているように思えます。これはおそらく、バリアントに浮動小数点型が含まれていないためです。そのコードの2番目のスニペットでは、基になるデータ型が実際にQByteArrayであるように見えます。この場合、浮動小数点の格納方法を知る必要があります。たとえば、基本的に浮動小数点数の文字列表現ですか?または生のフロートデータ? – 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

提供された情報によると、浮動小数点値はQVariant内のQByteArray内部の生データ形式で格納されています。

まず、浮動小数点型の値を浮動小数点型としてQVariantに格納するほうがはるかに簡単で簡単であることに注意することは重要です。これによりコードが簡単になるだけでなく、データ変換やプラットフォームのエンディアンに関連するクロスプラットフォームの問題を回避することができます。

にかかわらず、次のような何かを行うことによって、あなたのバリエーションから自分のfloat値を抽出することができるはずです。

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

も注意してください:コードのあなたの余分なスニペットでは、あなたがQByteArray :: toFloatを使用しようとしましたQByteArrayデータをfloatに変換する関数です。この関数は、あなたのQByteArrayが生の浮動小数点データを含むような状況ではなく、浮動小数点数の文字列表現に対してのみ機能することに注意してください。 QByteArray :: toFloatとQVariant :: toFloatの両方には、変換の成功/失敗を示すオプションのboolパラメータがあります。このような問題に気づくのに役立つ価値があります!

+0

データはCOM関数から返されます(返り値の型はVARIANTです)QtはQVariantとしてデータを提供しますが、何もできません。あなたが正しい方向に私を指している、私は非常に似た方法をあなたが示唆した(最初の記事も参照してください)見つけました。 – snucker

関連する問題