Название: Чтение/запись INI файла Отправлено: Igors от Декабрь 10, 2012, 21:33 Добрый день
Навеяно этим http://www.prog.org.ru/index.php?topic=23719.msg167660#msg167660 (http://www.prog.org.ru/index.php?topic=23719.msg167660#msg167660) Как обычно, обсуждение архитектуры - ну нельзя сказать чтобы "бесполезно", но капитально застряет на специфике задачи. Возможно есть смысл "поархитектурить" на вещи которая всем известна. Есть диалог, общее число опций напр 60, рассованы напр по 5 табам. Нужно читать/писать все параметры в INI файл, допустим 1 табка 1 секция + какие-то общие параметры что в UI находятся вне рамок таба. Делать бинарную сериализацию не хочется т.к. диалог часто меняется. Ручное редактирование текстовика вполне возможно, поэтому имена параметров в INI должны быть внятными. Для пользователя выглядит так: нажал Save - задал файл, сохранил. Нажал Load, выбрал файл. Появился вспомогательный диалог где можно указать какие табки загружать. Ok - загрузили, UI соответственно изменилось. Если какие-то опции отсутствуют в INI или записаны там с ошибкой - сообщить Полагаю что для продвинутых Qt пользователей такая задачка не составляет особой сложности. Какие структуры данных, классы и взаимодействия нужно реализовать? Спасибо Название: Re: Чтение/запись INI файла Отправлено: V1KT0P от Декабрь 10, 2012, 22:13 Я бы попробовал json. Очень он мне нравится своей простотой и гибкостью.
Название: Re: Чтение/запись INI файла Отправлено: Bepec от Декабрь 10, 2012, 22:40 Я пользуюсь QSettings.
Менеджер настроек представляет собой класс, который все эти данные соотносит, сохраняет и загружает. В результате на выходе ini файл, дружелюбный пользователю. Добавление/изменение настройки = изменение в функции сохранения/загрузки класса. Название: Re: Чтение/запись INI файла Отправлено: Igors от Декабрь 11, 2012, 10:32 Я бы попробовал json. Очень он мне нравится своей простотой и гибкостью. В смысле любой уровень вложенности массивов/контейнеров? Хорошее дело, но здесь одного уровня (по табкам) вполне хватает. А вот возможность редактировать текстовик желательна. Да и json ридер "надо изыскивать" и прикручивать (пусть их и много).Я пользуюсь QSettings. Прошу показать каким образом, напр в псевдокоде. Все 60 параметров расписывать не надо, так, пару-тройкуМенеджер настроек представляет собой класс, который все эти данные соотносит, сохраняет и загружает. В результате на выходе ini файл, дружелюбный пользователю. Добавление/изменение настройки = изменение в функции сохранения/загрузки класса. Название: Re: Чтение/запись INI файла Отправлено: GreatSnake от Декабрь 11, 2012, 12:11 Прошу показать каким образом, напр в псевдокоде. Все 60 параметров расписывать не надо, так, пару-тройку Как-то так:Код Update: добавил группировку по табам) Название: Re: Чтение/запись INI файла Отправлено: Bepec от Декабрь 11, 2012, 12:13 Необходима соответственно небольшая подготовка - слот у объектов, отдающий параметры или передача из объектов параметров менеджеру
Код: // QList<QPair<QVariant, QVariant>> valueList_; В принципе нужна ещё обвязка для распределения настроек по классам. (я так делаю) Или же как упоминал - получение настроек из менеджера. Псевдокод фиговый если честно :) На деле есть ещё разделение по группам beginGroup. Распределение ведётся по строке first(QVariant)где закодировано название/класс виджета + название настройки. PS извиняюсь если сумбурно моё изложение. Название: Re: Чтение/запись INI файла Отправлено: GreatSnake от Декабрь 11, 2012, 12:17 2 Bepec
Цитировать « Ответ #5 : Сегодня в 13:13:13 » Хорошее время ты выбрал для поста)Название: Re: Чтение/запись INI файла Отправлено: Igors от Декабрь 13, 2012, 09:47 В принципе нужна ещё обвязка для распределения настроек по классам. (я так делаю) Или же как упоминал - получение настроек из менеджера. Ну так рассказывайте что за менеджер, а то что Вы показываете цикл for который ни о чем не говорит :)Как-то так: Хороший, боевой вариант. С точки зрения реализации я бы не лез в ближний бой if/else, а сделал бы это расширяемым (псевдокод)Код
Код Чтобы если появился какой-то хитрый контрол - спокойно долить это в в контейнер converters. Но это сути не меняет. Привлекательна общность, для любого диалога надо только назначить имена (это так и так надо делать) - и работает. Однако как же так - ведь это смешивает "бизнес-логику" (как говорит Akon) с UI. Ну действительно, чуть другая задача - мы сначала выбираем ini файл, а потом уж показываем диалог - или вообще не показываем. Тогда не видно как воспользоваться написанным, придется городить еще один "параллельный" вариант Я понимаю что то легко говорить, мол, "не смешивайте", а доходит до дела - так куда что девается (и как быстро находятся само-оправдания :)) Название: Re: Чтение/запись INI файла Отправлено: Bepec от Декабрь 13, 2012, 13:04 У меня к сожалению нет возможности "выдрать" код из проекта. Слишком эмм... много зависимостей.
Но структура проста - имеется у менеджера список подключенных виджетов, в который они сами добавляются. Потом они передают настройки и он их сохраняет в группу, название которой содержит класс виджета и его objectName. Ну и в обратном направлении так же - проверяется наличие в списке загруженных настроек и тогда отдаются. Название: Re: Чтение/запись INI файла Отправлено: Igors от Декабрь 14, 2012, 14:01 У меня к сожалению нет возможности "выдрать" код из проекта. Слишком эмм... много зависимостей. Что-то не видно обычной словоохотливости :) Ну ладно, у каждого есть места где гордиться нечем, но которые (как-то) работают - и слава богу. Это нормально. Но структура проста - имеется у менеджера список подключенных виджетов, в который они сами добавляются. Потом они передают настройки и он их сохраняет в группу, название которой содержит класс виджета и его objectName. Ну и в обратном направлении так же - проверяется наличие в списке загруженных настроек и тогда отдаются. А вот как это решалось в шейдерах 3ds (как сейчас - не знаю, но во всяком случае так было). Конструктор ниже (с переменным числом параметров) очень скромный, бывали в неск раз больше. Впрочем главная идея (дескриптор параметра) мне кажется верной и сейчас. Код
|