почему qtsettings хранит float в странном режиме, чего мне не хватает? - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь создать файл настроек, например:

[график] вес = 3,154

[ui] color = # 00FFC1

но я получаю что-то вроде

[graph] weight = @ 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 64bit

1 Ответ

0 голосов
/ 07 марта 2019

Вы действительно ничего не упускаете. Все, что вы видите, это то, как Qt кодирует INI-файлы. Поскольку не существует стандарта, описывающего, как определенные типы должны быть представлены в INI-файле, Qt определил их собственные. См. https://doc.qt.io/qt-5/qsettings.html#Format-enum для более подробной информации. Короче говоря, любой «специальный» тип представлен @<typename>(<data>), причем большинство из них далее кодируется как QVariant, для которого вы видите данные @Variant(<metaTypeId><data>). Идентификатор метатипа для числа с плавающей запятой равен 8 или \0\0\0\x8, закодированный как 32-разрядная шестнадцатеричная строка. Все, что находится после этих 4 символов, - это действительные двоичные данные, поскольку QDataStream::operator<< будет производить их. Однако, чтобы сделать INI-файлы, по крайней мере, несколько читаемыми и совместимыми с файлами, написанными другими приложениями, некоторые типы (такие как QString, int, double, bool, ...) используют другой, чаще известное представление.

Для этого конкретного случая они решили не программировать такое исключение кодирования для типа float. Точная причина мне неизвестна, но мое личное предположение состояло бы в том, что они хотели, чтобы в INI-файлах была возможность определить разницу между значениями типа double и float, чтобы кто-то случайно не интерпретировал float как double (и, таким образом, предположил, что данное число имеет двойную точность, хотя и не имеет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...