为什么qtsettings以奇怪的模式存储浮点数,缺少了什么?

时间:2019-03-07 13:12:13

标签: qt

am尝试创建如下设置文件:

  

[图]重量= 3.154

     

[ui] color =#00FFC1

但是得到类似的东西

  

[图]重量= @ Variant(\ 0 \ 0 \ 0 \ x87 @] / \ x1b)

     

[ui] color =#00FFC1

我的代码很简单,看起来像

QSettings settings("foo.ini", QSettings::IniFormat);
settings.beginGroup("graph");
settings.setValue("weight", 3.456f);
settings.endGroup();
settings.beginGroup("ui");
settings.setValue("color", "#00FFC1");
settings.endGroup();
settings.sync();

qt5.7.1(适用于Linux 64位)

1 个答案:

答案 0 :(得分:0)

您并没有真正错过任何东西。您所看到的就是Qt如何编码INI文件。由于没有标准描述在INI文件中应如何表示某些类型,因此Qt定义了它们自己的类型。有关更多详细信息,请参见https://doc.qt.io/qt-5/qsettings.html#Format-enum。简而言之,任何“特殊”类型都由@<typename>(<data>)表示,其中大多数都被进一步编码为QVariant,为此,您看到的数据为@Variant(<metaTypeId><data>)。 float的元类型id为8,或\0\0\0\x8编码为32位十六进制字符串。这四个字符之后的所有内容都是实际的二进制数据,就像QDataStream::operator<<会生成它一样。但是,为了使INI文件在某种程度上可读性强并且与其他应用程序编写的文件兼容,请使用某些类型(如QStringintdoublebool,.. 。)使用其他更常见的表示形式。

对于这种具体情况,他们决定不为float类型编写这样的编码异常。确切的原因对我来说是未知的,但我个人的猜测是,他们希望能够区分INI文件中的double和float之间的区别,因此,有人不会不小心将float解释为double(因此假设给定的数字即使没有,也具有双精度。