Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alex_C от Июль 16, 2012, 14:38



Название: [Решено] QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 16, 2012, 14:38
Проблема - есть много ini-файлов, описывающих систему команд устройств.
команды имеют вид
Command=(12345;)
QSettings при чтении отбрасывает точку с запятой и все, что за ней. Можно ли как то ему объяснить, что это не комментарий, и результатом должна быть строка целиком?


Название: Re: QSettings - заставить считать ";"
Отправлено: Пантер от Июль 16, 2012, 14:42
http://doc-snapshot.qt-project.org/4.8/qsettings.html#registerFormat

И делаешь, что хочешь.


Название: Re: QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 16, 2012, 15:33
Да то что надо!
Однако одна проблема - ф-ции readRigIniFile и writeRigIniFile не вызываются

Код
C++ (Qt)
   const QSettings::Format RigIniFormat =
                QSettings::registerFormat("ini", readRigIniFile, writeRigIniFile);
 
   QSettings iniFile(RigIniFormat, QSettings::UserScope, "", "");
 



Код
C++ (Qt)
bool readRigIniFile(QIODevice &device, QSettings::SettingsMap &map)
{
   QFile f(&device);
   QString sectionName = "";
   while(f.atEnd())
   {
       QString s = f.readLine();
       s = s.trimmed();
       if(s.startsWith('[') && s.endsWith(']'))
           sectionName = s.mid(1, s.size() - 2);
       else
       {
           QStringList sl = s.split('=');
           if(sl.size() == 2)
           {
               sl[0] = sl[0].trimmed();
               sl[1] = sl[1].trimmed();
               map.insert(sectionName + "/" + sl[0], sl[1]);
           }
       }
   }
   return true;
}
 
 


Название: Re: QSettings - заставить считать ";"
Отправлено: Пантер от Июль 16, 2012, 15:36
Попробуй задать организацию и имя проги.


Название: Re: QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 16, 2012, 15:39
Да пробовал - все тоже...
Видел, где такая же проблема на форуме обсуждалась - но там так причину не вызова этих ф-ций и не нашли.


Название: Re: QSettings - заставить считать ";"
Отправлено: Пантер от Июль 16, 2012, 15:48
Минимальный компилябельный пример приложи.


Название: Re: QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 16, 2012, 15:52
Решено! Правильно
Код
C++ (Qt)
QSettings iniFile(fileName, RigIniFormat);
 

а не

Код
C++ (Qt)
QSettings iniFile(RigIniFormat, QSettings::UserScope, "", "");
 


Название: Re: [Решено] QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 16, 2012, 16:07
Т.к. данный момент думаю многим интересен будет, приведу рабочий код -
и так: как самому считывать данные из ini- файла

Код
C++ (Qt)
  rigIniFileName = <Путь к ini-файлу>;
 
   const QSettings::Format RigIniFormat =
                QSettings::registerFormat("ini", readRigIniFile, writeRigIniFile);
   QSettings iniFile(rigIniFileName, RigIniFormat);
 
 

Код
C++ (Qt)
QString rigIniFileName;
 
bool readRigIniFile(QIODevice &device, QSettings::SettingsMap &map)
{
   QFile f(rigIniFileName);
   f.open(QIODevice::ReadOnly);
   QString sectionName = "";
   while(!f.atEnd())
   {
       QString s = f.readLine();
       s = s.trimmed();
       if(s.startsWith(';'))
           continue;
       else if(s.startsWith('[') && s.endsWith(']'))
           sectionName = s.mid(1, s.size() - 2);
       else
       {
           QStringList sl = s.split('=');
           if(sl.size() == 2)
           {
               sl[0] = sl[0].trimmed();
               sl[1] = sl[1].trimmed();
               map.insert(sectionName + "/" + sl[0], sl[1]);
           }
       }
   }
   return true;
}
 

Обращаю внимание - если мы не хотим переопределять QSettings - мы сами должны позаботиться, из какого файла считывать данные!


Название: Re: [Решено] QSettings - заставить считать ";"
Отправлено: Пантер от Июль 16, 2012, 16:13
У тебя же передается в функцию QIODevice &device, который и есть твой открытый файл.


Название: Re: [Решено] QSettings - заставить считать ";"
Отправлено: Igors от Июль 16, 2012, 16:27
Код
C++ (Qt)
           if(sl.size() == 2)
 
Конечно простота - залог здоровья, но все-таки значение параметра может содержать пробелы 


Название: Re: [Решено] QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 16, 2012, 22:23
У тебя же передается в функцию QIODevice &device, который и есть твой открытый файл.

Я тоже так думал - но если определять так
Код
C++ (Qt)
QFile f(&device);
 

как я видел в инете - не работает.



Название: Re: [Решено] QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 16, 2012, 22:27
Код
C++ (Qt)
           if(sl.size() == 2)
 
Конечно простота - залог здоровья, но все-таки значение параметра может содержать пробелы 

Ну и пускай содержит. В чем проблема? Разбиваем мы же строку по =, а не по пробелам.
Плюс конечно - обработку можно сделать какую угодно - это тут так, по быстрому для примера :)


Название: Re: [Решено] QSettings - заставить считать ";"
Отправлено: mutineer от Июль 16, 2012, 22:38
У тебя же передается в функцию QIODevice &device, который и есть твой открытый файл.

Я тоже так думал - но если определять так
Код
C++ (Qt)
QFile f(&device);
 

как я видел в инете - не работает.

И какой результат ты ожидаешь? строчка твоя создает файл f, у которого родитель device


Название: Re: [Решено] QSettings - заставить считать ";"
Отправлено: Alex_C от Июль 17, 2012, 13:06
Признаю - излише поторопыжничал. Не гляда взял строчку с инета. Конешно device - это и есть уже открытый фаил!
Спасибо за замечание!