Russian Qt Forum
Ноябрь 24, 2024, 04:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSettings и пробелы в ключах/группах  (Прочитано 5119 раз)
prefetch
Гость
« : Декабрь 04, 2008, 13:56 »

Столкнулся с проблемой при записи значений в QSettings, если какие-либо ключи или группы содержат пробелы, то происходит их замена на код пробела %20.
К примеру было так:
Код:
[Global Configuration]
Device Name=1
После изменения "Device Name" на 2 и сохранении результата:
Код:
[Global%20Configuration]
Device%20Name=2

В описании QSettings сказано:
Цитировать
The INI file format has severe restrictions on the syntax of a key. Qt works around this by using % as an escape character in keys.

Вопрос как избежать замены пробела на %20 при сохранении?
Qt 4.5.0 (snapshot 01-12-08), mingw, Windows XP SP3
Записан
hardum
Гость
« Ответ #1 : Декабрь 05, 2008, 12:12 »

Нужно переопределить
  QSettings::ReadFunc()
  QSettings::WriteFunc()
и реализовать в них тот алгоритм сохранения-восстановления параметров, который требуется
Что-то вроде:
Код:
class CMyQSettings: protected QSettings
{
  protected:
    static bool ReadFunc(QIODevice &__device, QSettings::SettingsMap &__map);
    static bool WriteFunc(QIODevice &__device, const QSettings::SettingsMap &__map);

   static QSettings::Format GetFormat();
};


...

CMyQSettings::WriteFunc(QIODevice &__device, QSettings::SettingsMap &__map)
{
  // Записываем как хочется
}

CMyQSettings::ReadFunc(QIODevice &__device, QSettings::SettingsMap &__map)
{
  // Считываем как хочется
}


QSettings::Format CIniFile::GetFormat()
{
   static QSettings::Format fmt = QSettings::registerFormat("ini", CMyQSettings::ReadFunc, CMyQSettings::WriteFunc);
   return fmt;
}
« Последнее редактирование: Декабрь 05, 2008, 14:01 от hardum » Записан
Hort
Гость
« Ответ #2 : Декабрь 05, 2008, 13:10 »

может тебе будет проще писать
Код:
[GlobalConfiguration]
DeviceName=1
т.е. без пробелов вообще? как обычно собственно и делается
Записан
prefetch
Гость
« Ответ #3 : Декабрь 05, 2008, 17:30 »

Нужно переопределить
  QSettings::ReadFunc()
  QSettings::WriteFunc()
и реализовать в них тот алгоритм сохранения-восстановления параметров, который требуется
Что-то вроде:
Код:
class CMyQSettings: protected QSettings
{
  protected:
    static bool ReadFunc(QIODevice &__device, QSettings::SettingsMap &__map);
    static bool WriteFunc(QIODevice &__device, const QSettings::SettingsMap &__map);

   static QSettings::Format GetFormat();
};


...

CMyQSettings::WriteFunc(QIODevice &__device, QSettings::SettingsMap &__map)
{
  // Записываем как хочется
}

CMyQSettings::ReadFunc(QIODevice &__device, QSettings::SettingsMap &__map)
{
  // Считываем как хочется
}


QSettings::Format CIniFile::GetFormat()
{
   static QSettings::Format fmt = QSettings::registerFormat("ini", CMyQSettings::ReadFunc, CMyQSettings::WriteFunc);
   return fmt;
}

В принципе можно, но тогда уж лучше написать свой собственный парсер ini файлов.
Хотелось бы все сделать в едином ключе и прозрачно.
Записан
prefetch
Гость
« Ответ #4 : Декабрь 05, 2008, 17:33 »

может тебе будет проще писать
Код:
[GlobalConfiguration]
DeviceName=1
т.е. без пробелов вообще? как обычно собственно и делается
Я бы так и сделал, проблема в том что это конфиг другой программы.
Хотя я тоже склоняюсь к идее внести изменения в эту стороннюю программу.  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.144 секунд. Запросов: 20.