Название: [Решено] Обмен данными между объектами разных классов Отправлено: titan83 от Декабрь 01, 2014, 09:44 Здравствуйте.
Начал делать проект и подзавис на такой проблеме: у есть класс, в котором я хочу централизованно хранить настройки, как уставки, задаваемые пользователем (через графический или web-интерфейс), так и вычисляемые по ходу работы параметры, это необходимо для того, чтобы можно было сохранять все текущие параметры в энергонезависимой памяти и восстанавливать работу программы после отключения питания, а также цетрализованно обновлять данные на графических интерфейсах (экранчик и веб-морда). Т.е. схема должна выглядеть так: QDisplay QWebInterface QController MainWindow ^ ^ ^ | | | | v | -------> QSettings <------------ ^ | v QFram Объекты классов QDisplay, QWebInterface, QController, QSettings находятся в MainWindow, соответственно, напрямую между собой общаться не могут, и это правильно, ибо делает связи очень слабыми. Но есть одна проблема - для того, чтобы изменить настройки я из любого объекта посылаю сигнал sigChangeValue(argKey, argValue) в MainWindow, там этот сигнал зацеплен на слот setValue класса QSettings, и все работает отлично. Однако я не понимаю, как мне читать настройки из QSettings (фактически - вызывать метод value() объекта settings), например, из класса QController? Спасибо всем дочитавшим до конца) Название: Re: Обмен данными между объектами разных классов Отправлено: titan83 от Декабрь 01, 2014, 09:54 Я пока что увидел только один путь - при инициализации программы посылать все желающим работать с настройками объектам указатель на объект настроек. Но как-то не воодушевляет...
Название: Re: Обмен данными между объектами разных классов Отправлено: Пантер от Декабрь 01, 2014, 10:10 Вполне нормально - в каждом классе предусмотреть публичный метод void readSettings(const QSettings &settings) и пусть себе читают. Можно еще забабахать свой синглтон настроек и всем его юзать (я предпочитаю такой вариант), но тогда все классы должны будут его инклудить.
Название: Re: Обмен данными между объектами разных классов Отправлено: Igors от Декабрь 01, 2014, 10:25 Можно поступить аналогично sigGetValue(argKey, argValue), создав нужный слот в наследнике QSettings. Хотя мне все это кажется излишним - settings глобальная переменная, это незачем скрывать
Название: Re: Обмен данными между объектами разных классов Отправлено: Old от Декабрь 01, 2014, 11:01 Передавайте ссылку (или указатель) на объект QSettings при конструировании объектов классов от него зависящих QDisplay, QWebInterface, QController.
Название: Re: Обмен данными между объектами разных классов Отправлено: xokc от Декабрь 01, 2014, 11:12 Что-то я не понимаю в чём именно сложность? QSettings изначально и создан именно для решения подобных задач.
Цитирую: Constructing and destroying a QSettings object is very fast. Название: Re: Обмен данными между объектами разных классов Отправлено: Old от Декабрь 01, 2014, 11:28 Что-то я не понимаю в чём именно сложность? QSettings изначально и создан именно для решения подобных задач. Я так понял, что все таки имеется ввиду свое централизованное хранилище настроек, с таким же названием.Цитирую: Constructing and destroying a QSettings object is very fast. Qt-ешный QSettings не умеет посылать сигналы о изменении параметров, а это в указанной задаче первое дело. Название: Re: Обмен данными между объектами разных классов Отправлено: titan83 от Декабрь 01, 2014, 11:46 Можно поступить аналогично sigGetValue(argKey, argValue), создав нужный слот в наследнике QSettings. Думал об этом, но слот-то можно создать, а как вернуть значение именно в то место, из которого запросили?Поэтому Передавайте ссылку (или указатель) на объект QSettings при конструировании объектов классов от него зависящих QDisplay, QWebInterface, QController. На самом деле прямое чтение мне необходимо только в классе, реализующем бизнес-логику приложения, средства отображения вполне обойдутся сигналами-слотами.Всем откликнувшимся - большое спасибо. Название: Re: Обмен данными между объектами разных классов Отправлено: Igors от Декабрь 01, 2014, 12:30 Думал об этом, но слот-то можно создать, а как вернуть значение именно в то место, из которого запросили? argValue по ссылке или указателюНазвание: Re: Обмен данными между объектами разных классов Отправлено: xokc от Декабрь 01, 2014, 17:03 Я так понял, что все таки имеется ввиду свое централизованное хранилище настроек, с таким же названием. Тогда оно больше не на хранилище настроек похоже, а на модель. Да и судя по названию остальных классов (QDisplay, QWebInterface, QController) именно QModel топикстартеру и не хватает :)Qt-ешный QSettings не умеет посылать сигналы о изменении параметров, а это в указанной задаче первое дело. Название: Re: Обмен данными между объектами разных классов Отправлено: titan83 от Декабрь 02, 2014, 08:44 Я так понял, что все таки имеется ввиду свое централизованное хранилище настроек, с таким же названием. Тогда оно больше не на хранилище настроек похоже, а на модель. Да и судя по названию остальных классов (QDisplay, QWebInterface, QController) именно QModel топикстартеру и не хватает :)Qt-ешный QSettings не умеет посылать сигналы о изменении параметров, а это в указанной задаче первое дело. И все изменения вычисляемых параметров производятся только в классе QController, так что прямой доступ к настройкам будет только у него, все отображатели обойдутся сигналами. Но за наводку на MVC-модель Qt вам лично большое спасибо. Использовал такую штуку давно при работе с Python/Django. В Qt тоже понадобиться - особенно при работе с базами данных. Спасибо еще раз! |