|
Навигация
|
Главная » Sql Один из методов работы с конфигурационными файлами в С++ (Qt)Источник: habrahabr unixod Практически в каждом проекте, встает задача персистентного чтения/записи конфигурации. Не секрет что существует большое количество уже готовых библиотек для решения этой задачи. Некоторые из-них просты, некоторые чуть сложнее в использовании.Если же проект разрабатывается с использованием Qt, думаю нет смысла линковать дополнительную библиотеку, так как в Qt есть все средства для создания очень простого, гибкого и кроссплатформенного решения. Как раз о таком решении хочу расказать вам в этом посте. ВведениеВ Qt есть очень удобный класс QSettings . В принципе он очень прост в использовании:
Из приведенного выше примера, обычного использования QSettings , сразу становятся видны проблемы расширяемости и поддержки кода:
Если внимательно еще раз просмотреть все вышеописанные проблемы, то можно сделать вывод: ключ представлен строкой - это и есть основная проблема. Ведь действительно, если в качестве ключа мы будем использовать перечисления (enums), то все вышеперечисленное разом улетучивается. Перечисления конечно же удобны, но QSettings требует, в качестве параметра ключа - строку. Т.е. нам нужен некоторый механизм, который давал бы нам возможность транслировать значения перечислений в строки (извлекать строковые значения элементов перечислений). Например из следующего перечисления:
нужно как-то извлечь 3 строки: "One", "Two", "Three". К сожалению стандартными средствами C++ это сделать невозможно. Но как же быть? Тут нам на помощь приходит Qt со своей метаобъектной моделью, а если точнее QMetaEnum . Про QMetaEnum писать не буду, так как это уже отдельная тема. Могу лишь дать ссылки: раз, два. РеализацияИмея на вооружении QMetaEnum , теперь мы можем реализовать класс Settings, лишенный всех вышеперечисленных недостатков, а также предоставляющий возможность задания дефолтных настроек. Класс Settings представляет из себя синглтон Мейерса, это нам дает простоту настройки и его использования: settings.h (Раскрыть спойлер) settings.cpp (Раскрыть спойлер) В данной реализации, класс QSettings , используется исключительно для кроссплатформенного доступа к настройкам. Конечно же по желанию QSettgins может быть заменен любым другим механизмом, например SQLite . Пример использованияКласс Settings предоставляет очень простой и удобный интерфейс, состоящий всего из трех статических методов: void setDefaults(const QString &str); - установка параметров поумолчаниюQVariant get(Key, Section); - чтение значения (секция может быть опущена)ValueRef set(Key, Section); - запись значения (секция может быть опущена)
вот пример синтаксиса описания настроек по умолчанию: default.cfg (Раскрыть спойлер) как можно заметить формат - простой: [section name]/key : value; ЗаключениеСтоит заметить что данный класс Settings легко расширяется. Т.е. при желании, добавить/удалить/переименовать какие-нибудь ключи или секции, всего лишь надо изменить соответствующий enum! У читающего может возникнуть вопрос а нельзя ли как нибудь вынести общую логику "за скобки". Ответ: можно но лучше не стоит. Так как метаобъектная модель Qt не работает с шаблонами, придется использовать макросы, что в свою очередь влечет за собой известные проблемы:
При сборке не забываем включить поддержку С++11:
Спасибо за внимание. ) Блокировки Oracle при неиндексированных внешних ключах. Объекты в Oracle - это очень просто. Аналитические функции в Oracle (Часть 2). Выводимые таблицы с хранимым результатом. Часть 1. Docsvision показала 100% совместимость с Microsoft SQL Server 2012.. Главная » Sql |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |