Russian Qt Forum

Qt => Общие вопросы => Тема начата: prefetch от Декабрь 04, 2008, 13:56



Название: QSettings и пробелы в ключах/группах
Отправлено: 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


Название: Re: QSettings и пробелы в ключах/группах
Отправлено: hardum от Декабрь 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;
}


Название: Re: QSettings и пробелы в ключах/группах
Отправлено: Hort от Декабрь 05, 2008, 13:10
может тебе будет проще писать
Код:
[GlobalConfiguration]
DeviceName=1
т.е. без пробелов вообще? как обычно собственно и делается


Название: Re: QSettings и пробелы в ключах/группах
Отправлено: prefetch от Декабрь 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 файлов.
Хотелось бы все сделать в едином ключе и прозрачно.


Название: Re: QSettings и пробелы в ключах/группах
Отправлено: prefetch от Декабрь 05, 2008, 17:33
может тебе будет проще писать
Код:
[GlobalConfiguration]
DeviceName=1
т.е. без пробелов вообще? как обычно собственно и делается
Я бы так и сделал, проблема в том что это конфиг другой программы.
Хотя я тоже склоняюсь к идее внести изменения в эту стороннюю программу.  :)