crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Странное сохранение значения QSettings+QVariant+float
Гость_sss_*
сообщение 3.8.2010, 9:22
Сообщение #1





Гости








    


    QSettings s("q.ini", QSettings::IniFormat);
    s.setValue("test", 123.0f);

дает на выходе
[General]
test=@Variant(\0\0\0\x87\x42\xf6\0\0)

если использовать тип double все нормально. Это баг или фича? qt 4.6.0.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.8.2010, 9:33
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2928
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


А обратно загружается правильно?

Данная ескейп-последовательность - это массив

unsigned char p[]={0x00,0x00,0x00,0x87,0x42,0xF6,0x00,0x00};

отладчик говорит, ((float)123.0) должно быть
00 00 F6 42

мы и видим это в конце - 0x42,0xF6,0x00,0x00 (42 - младший байт)

(но, может, там ещё какая-то инфа дописывается)

Сообщение отредактировал Алексей1153 - 3.8.2010, 9:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 3.8.2010, 10:57
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


На самом деле при таком раскладе проще настройки тогда держать где-нибудь в двоичном файле, так как пользователь все-равно не может изменить вручную подобные значения через текстовый редактор.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_sss_*
сообщение 3.8.2010, 13:19
Сообщение #4





Гости








    


Читать, то он читает... Даже обход проблемы понятен что-то типа setValue("test" QString().setNum(123.0f)), но все равно это как-то перанально...

Кстати, ковырнул тут исходник qt, выяснилось следующее: похоже косяк в методе QString QSettingsPrivate::variantToString(const QVariant &v) из файла qsettings.cpp строка 461. Там идет такой большой switch в котором есть следующий блок случаев:
 case QVariant::String:
        case QVariant::LongLong:
        case QVariant::ULongLong:
        case QVariant::Int:
        case QVariant::UInt:
        case QVariant::Bool:
        case QVariant::Double:
        case QVariant::KeySequence: {
            result = v.toString();
            if (result.startsWith(QLatin1Char('@')))
                result.prepend(QLatin1Char('@'));
            break;
        }

Похоже сдесь чисто теоретически не хватает что-то типа QMetaType::Float. Кто проверит это на практике и сообщит об этом разработчикам?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.10.2021, 8:20