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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] QSettings - заставить считать ";"  (Прочитано 7507 раз)
Alex_C
Гость
« : Июль 16, 2012, 14:38 »

Проблема - есть много ini-файлов, описывающих систему команд устройств.
команды имеют вид
Command=(12345;)
QSettings при чтении отбрасывает точку с запятой и все, что за ней. Можно ли как то ему объяснить, что это не комментарий, и результатом должна быть строка целиком?
« Последнее редактирование: Июль 16, 2012, 15:53 от Alex_C » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 16, 2012, 14:42 »

http://doc-snapshot.qt-project.org/4.8/qsettings.html#registerFormat

И делаешь, что хочешь.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex_C
Гость
« Ответ #2 : Июль 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;
}
 
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Июль 16, 2012, 15:36 »

Попробуй задать организацию и имя проги.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex_C
Гость
« Ответ #4 : Июль 16, 2012, 15:39 »

Да пробовал - все тоже...
Видел, где такая же проблема на форуме обсуждалась - но там так причину не вызова этих ф-ций и не нашли.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Июль 16, 2012, 15:48 »

Минимальный компилябельный пример приложи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex_C
Гость
« Ответ #6 : Июль 16, 2012, 15:52 »

Решено! Правильно
Код
C++ (Qt)
QSettings iniFile(fileName, RigIniFormat);
 

а не

Код
C++ (Qt)
QSettings iniFile(RigIniFormat, QSettings::UserScope, "", "");
 
Записан
Alex_C
Гость
« Ответ #7 : Июль 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 - мы сами должны позаботиться, из какого файла считывать данные!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Июль 16, 2012, 16:13 »

У тебя же передается в функцию QIODevice &device, который и есть твой открытый файл.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июль 16, 2012, 16:27 »

Код
C++ (Qt)
           if(sl.size() == 2)
 
Конечно простота - залог здоровья, но все-таки значение параметра может содержать пробелы 
Записан
Alex_C
Гость
« Ответ #10 : Июль 16, 2012, 22:23 »

У тебя же передается в функцию QIODevice &device, который и есть твой открытый файл.

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

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

Записан
Alex_C
Гость
« Ответ #11 : Июль 16, 2012, 22:27 »

Код
C++ (Qt)
           if(sl.size() == 2)
 
Конечно простота - залог здоровья, но все-таки значение параметра может содержать пробелы 

Ну и пускай содержит. В чем проблема? Разбиваем мы же строку по =, а не по пробелам.
Плюс конечно - обработку можно сделать какую угодно - это тут так, по быстрому для примера Улыбающийся
Записан
mutineer
Гость
« Ответ #12 : Июль 16, 2012, 22:38 »

У тебя же передается в функцию QIODevice &device, который и есть твой открытый файл.

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

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

И какой результат ты ожидаешь? строчка твоя создает файл f, у которого родитель device
Записан
Alex_C
Гость
« Ответ #13 : Июль 17, 2012, 13:06 »

Признаю - излише поторопыжничал. Не гляда взял строчку с инета. Конешно device - это и есть уже открытый фаил!
Спасибо за замечание!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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