Russian Qt Forum

Qt => Общие вопросы => Тема начата: Гурман от Января 14, 2015, 22:11



Название: (РЕШЕНО) 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 )


Опередили :)

Из старого заброшенного проекта:
Код
C++ (Qt)
...
QString getSettingsPath()
{
   return QDir::toNativeSeparators( qApp->applicationDirPath() + "/settings.ini" );
}
...
QSettings * createSettings()
{
   return new QSettings( getSettingsPath(), QSettings::IniFormat );
}


Название: 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
Не понял проблемы. Вот есть конструктор
Код
C++ (Qt)
QSettings::QSettings(const QString & fileName, Format format, QObject * parent = 0)
И что, он не может привязаться к файлу в произвольном месте? (fileName - полный путь) А если может - тогда в чем трудности?


Название: Re: QSettings::setPath(...) - как задать произвольный маршрут?
Отправлено: Гурман от Января 16, 2015, 12:18
Не понял проблемы. Вот есть конструктор
Код
C++ (Qt)
QSettings::QSettings(const QString & fileName, Format format, QObject * parent = 0)
И что, он не может привязаться к файлу в произвольном месте? (fileName - полный путь) А если может - тогда в чем трудности?

Еще раз. Проблема не в том, как задать маршрут, когда объект QSettings создается. Проблема в том, как изменить маршрут, когда этот объект создан. Вариант с созданием нового объекта пока не очень нравится, но похоже это единственный выход.


Название: Re: QSettings::setPath(...) - как задать произвольный маршрут?
Отправлено: Гурман от Января 16, 2015, 13:35
В общем, так и сделал. Сконструировано было изначально правильно, поэтому получилось хорошо и красиво. Всего 10 строк вместе с сообщением об ошибке, если файл настроек не удалось скопировать.