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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) QSettings::setPath(...) - как задать произвольный маршрут?  (Прочитано 8570 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Январь 14, 2015, 22:11 »

У меня по задаче нужна возможность задавать в приложении произвольный маршрут для файлов настроек. Например, сетевой каталог. Маршрут выбирается в главном приложении, оно грузит плагины, а те получают маршрут и хранят там свои настройки. Плагины для работы с настройками используют класс, наследующий от QSettings. Переделывать там ничего нельзя, отлажено, проверенно и гвоздями прибито. Добрался до задания маршрута для файлов настроек, а там облом - метод QSettings::setPath() требует параметр Scope, который жестко ограничивает каталоги, где могут храниться настройки. И задать там сетевой каталог... можно только, например, сделав в операционной системе пользовательский каталог сетевым. Что выглядит муторно и не соответствует начальным условиям задачи. А если потребуется сделать приложение мобильным, работающим с флешки, то получается вообще полная ерунда. Причем, если не использовать setPath(), то изначально настройки берутся из любого каталога, который задан при создании объекта класса QSettings.  

Кто-нибудь знает способ нормально выкрутиться из этого? Как то можно задать произвольный каталог, в котором объект QSettings будет держать файл настроек?
« Последнее редактирование: Январь 16, 2015, 13:35 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 14, 2015, 22:23 »

Передавайте путь как строку, а плагины будут добавлять к нему имя файла и открывать его через конструктор:
QSettings::QSettings ( const QString & fileName, Format format, QObject * parent = 0 )
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Январь 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 );
}
« Последнее редактирование: Январь 14, 2015, 22:25 от gil9red » Записан

Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Январь 14, 2015, 22:38 »

Вопрос не в том, как задать изначально маршрут для настроек - тут вопроса нет, оно так и сделано, как советуете. Вопрос в том - как маршрут поменять, когда QSettings уже создан.

Например, принесли приложение на флешке, у него настроен маршрут на ".". С флешки оно работает. Скопировали на компьютер, запустили, чтобы перенастроить маршрут на сетевой диск, а вовсе не на тот, который назначен системным. При этом было задумано, что приложение само перенесет файлы настроек в новый каталог, который выбран в приложении. Уже это не получается, поскольку плагины при этом загрузятся, и объект QSettings создастся.
Записан

2^7-1 == 127, задумайтесь...
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Январь 15, 2015, 09:36 »

Можно оформить QSettings как указатель и последовать примеру gil9red.
Просто создадите новый QSetting и всё...
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Январь 15, 2015, 11:22 »

Можно оформить QSettings как указатель и последовать примеру gil9red.
Просто создадите новый QSetting и всё...

У меня было несколько классов, которым передавал указатель на QSettings и у каждого из них было 2 функции readSettings и, соответственно, writeSettings, которые и работали с указателем.

Если что, тот проект, в котором такая система использовалась: https://github.com/gil9red/NotesManager
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Январь 15, 2015, 11:30 »

Вопрос не в том, как задать изначально маршрут для настроек - тут вопроса нет, оно так и сделано, как советуете. Вопрос в том - как маршрут поменять, когда QSettings уже создан.

Например, принесли приложение на флешке, у него настроен маршрут на ".". С флешки оно работает. Скопировали на компьютер, запустили, чтобы перенастроить маршрут на сетевой диск, а вовсе не на тот, который назначен системным. При этом было задумано, что приложение само перенесет файлы настроек в новый каталог, который выбран в приложении. Уже это не получается, поскольку плагины при этом загрузятся, и объект QSettings создастся.
У вас есть свой класс настроек. Внутри него можно делать так:
* синкаем настройки в текущий файл;
* копируем его в новое место;
* создаем новый QSettings с файлом из нового места.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Январь 15, 2015, 11:34 »

Можно оформить QSettings как указатель и последовать примеру gil9red.
Просто создадите новый QSetting и всё...

Ой мама дорогая... Можно, конечно, но это же придется мостырить копирование всех полей моего класса, который наследует QSettings - при создании нового экземпляра он должен получить все настройки, сделанные ранее. А их сейчас уже несколько десятков, и количество будет расти. То есть, еще одно место, куда надо не забывать добавлять при появлении новой настройки.

Я имел в виду сначала - может есть легальный способ сбросить в "" маршрут, который подразумевается при указании Scope у setPath.

А, кстати, что будет, если вызвать setPath( QSettings::IniFormat, QSettings::SystemScope, "L:\somedir\someother" ); ? Кто-нибудь вообще использует метод setPath?
« Последнее редактирование: Январь 15, 2015, 11:36 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Январь 15, 2015, 16:06 »

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Январь 16, 2015, 12:18 »

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

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

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Январь 16, 2015, 13:35 »

В общем, так и сделал. Сконструировано было изначально правильно, поэтому получилось хорошо и красиво. Всего 10 строк вместе с сообщением об ошибке, если файл настроек не удалось скопировать.
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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