Название: (РЕШЕНО) QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Гурман от Января 14, 2015, 22:11 У меня по задаче нужна возможность задавать в приложении произвольный маршрут для файлов настроек. Например, сетевой каталог. Маршрут выбирается в главном приложении, оно грузит плагины, а те получают маршрут и хранят там свои настройки. Плагины для работы с настройками используют класс, наследующий от QSettings. Переделывать там ничего нельзя, отлажено, проверенно и гвоздями прибито. Добрался до задания маршрута для файлов настроек, а там облом - метод QSettings::setPath() требует параметр Scope, который жестко ограничивает каталоги, где могут храниться настройки. И задать там сетевой каталог... можно только, например, сделав в операционной системе пользовательский каталог сетевым. Что выглядит муторно и не соответствует начальным условиям задачи. А если потребуется сделать приложение мобильным, работающим с флешки, то получается вообще полная ерунда. Причем, если не использовать setPath(), то изначально настройки берутся из любого каталога, который задан при создании объекта класса QSettings.
Кто-нибудь знает способ нормально выкрутиться из этого? Как то можно задать произвольный каталог, в котором объект QSettings будет держать файл настроек? Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Old от Января 14, 2015, 22:23 Передавайте путь как строку, а плагины будут добавлять к нему имя файла и открывать его через конструктор:
QSettings::QSettings ( const QString & fileName, Format format, QObject * parent = 0 ) Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: gil9red от Января 14, 2015, 22:24 Передавайте путь как строку, а плагины будут добавлять к нему имя файла и открывать его через конструктор: QSettings::QSettings ( const QString & fileName, Format format, QObject * parent = 0 ) Опередили :) Из старого заброшенного проекта: Код
Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Гурман от Января 14, 2015, 22:38 Вопрос не в том, как задать изначально маршрут для настроек - тут вопроса нет, оно так и сделано, как советуете. Вопрос в том - как маршрут поменять, когда QSettings уже создан.
Например, принесли приложение на флешке, у него настроен маршрут на ".". С флешки оно работает. Скопировали на компьютер, запустили, чтобы перенастроить маршрут на сетевой диск, а вовсе не на тот, который назначен системным. При этом было задумано, что приложение само перенесет файлы настроек в новый каталог, который выбран в приложении. Уже это не получается, поскольку плагины при этом загрузятся, и объект QSettings создастся. Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: __Heaven__ от Января 15, 2015, 09:36 Можно оформить QSettings как указатель и последовать примеру gil9red.
Просто создадите новый QSetting и всё... Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: gil9red от Января 15, 2015, 11:22 Можно оформить QSettings как указатель и последовать примеру gil9red. Просто создадите новый QSetting и всё... У меня было несколько классов, которым передавал указатель на QSettings и у каждого из них было 2 функции readSettings и, соответственно, writeSettings, которые и работали с указателем. Если что, тот проект, в котором такая система использовалась: https://github.com/gil9red/NotesManager Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Old от Января 15, 2015, 11:30 Вопрос не в том, как задать изначально маршрут для настроек - тут вопроса нет, оно так и сделано, как советуете. Вопрос в том - как маршрут поменять, когда QSettings уже создан. У вас есть свой класс настроек. Внутри него можно делать так:Например, принесли приложение на флешке, у него настроен маршрут на ".". С флешки оно работает. Скопировали на компьютер, запустили, чтобы перенастроить маршрут на сетевой диск, а вовсе не на тот, который назначен системным. При этом было задумано, что приложение само перенесет файлы настроек в новый каталог, который выбран в приложении. Уже это не получается, поскольку плагины при этом загрузятся, и объект QSettings создастся. * синкаем настройки в текущий файл; * копируем его в новое место; * создаем новый QSettings с файлом из нового места. Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Гурман от Января 15, 2015, 11:34 Можно оформить QSettings как указатель и последовать примеру gil9red. Просто создадите новый QSetting и всё... Ой мама дорогая... Можно, конечно, но это же придется мостырить копирование всех полей моего класса, который наследует QSettings - при создании нового экземпляра он должен получить все настройки, сделанные ранее. А их сейчас уже несколько десятков, и количество будет расти. То есть, еще одно место, куда надо не забывать добавлять при появлении новой настройки. Я имел в виду сначала - может есть легальный способ сбросить в "" маршрут, который подразумевается при указании Scope у setPath. А, кстати, что будет, если вызвать setPath( QSettings::IniFormat, QSettings::SystemScope, "L:\somedir\someother" ); ? Кто-нибудь вообще использует метод setPath? Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Igors от Января 15, 2015, 16:06 Не понял проблемы. Вот есть конструктор
Код И что, он не может привязаться к файлу в произвольном месте? (fileName - полный путь) А если может - тогда в чем трудности? Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Гурман от Января 16, 2015, 12:18 Не понял проблемы. Вот есть конструктор Код И что, он не может привязаться к файлу в произвольном месте? (fileName - полный путь) А если может - тогда в чем трудности? Еще раз. Проблема не в том, как задать маршрут, когда объект QSettings создается. Проблема в том, как изменить маршрут, когда этот объект создан. Вариант с созданием нового объекта пока не очень нравится, но похоже это единственный выход. Название: Re: QSettings::setPath(...) - как задать произвольный маршрут? Отправлено: Гурман от Января 16, 2015, 13:35 В общем, так и сделал. Сконструировано было изначально правильно, поэтому получилось хорошо и красиво. Всего 10 строк вместе с сообщением об ошибке, если файл настроек не удалось скопировать.
|