Russian Qt Forum

Qt => Model-View (MV) => Тема начата: lokoArt от Март 01, 2010, 08:49



Название: Вопросы по реализации
Отправлено: lokoArt от Март 01, 2010, 08:49
Добрый день. Пишу свою программу по работе с БД клиентов.
И у меня появились следующие вопросы:
первый:
У меня есть виджеты, и класс controller, а также ClientSqlQueryModel(наследник QSqlQueryModel).
При нажатии на кнопку, вызывается метод controller-а а он в свою очередь обращается к ClientSqlQueryModel.
Правильно ли я реализую с точки зрения MVC.

второй:
У меня есть некоторые настройки программы, и есть виджет в котором эти настройки задаются.
Как мне сохранять эти настройки?
Нужно ли создавать наследника QSettings?
Обращаться к controller или нет?



Название: Re: Вопросы по реализации
Отправлено: voronElf от Март 01, 2010, 09:15
1. controller кому-то потом эти данные предоставляет ? если да, то в каком виде.
    сообщения от модели об изменениях данных учитываешь в котнроллере (и нужны ли они) ?

2. В QSettings сохранять и читать настройки вполне удобно. Если функционала QSettings не хватает, тогда имеет смысл наследоваться от QSettings и добавлять нужную функциональность.

Цитировать
Обращаться к controller или нет?
Смотря какую роль выполняет controller. У меня в одной проге (немаленькой) для всех модулей программы заведен объект в котором собраны указатели на общие модели данных, подключение к бд и т.д., в том числе и на объект, отнаследованный от QSettings. В одном из модулей есть диалог для редактирования настроек, он просто в этот QSettings пишет изменеия, а модули читают настройки из него же.


Название: Re: Вопросы по реализации
Отправлено: lokoArt от Март 01, 2010, 09:49
1. controller кому-то потом эти данные предоставляет ? если да, то в каком виде.
    сообщения от модели об изменениях данных учитываешь в котнроллере (и нужны ли они) ?

2. В QSettings сохранять и читать настройки вполне удобно. Если функционала QSettings не хватает, тогда имеет смысл наследоваться от QSettings и добавлять нужную функциональность.

Цитировать
Обращаться к controller или нет?
Смотря какую роль выполняет controller. У меня в одной проге (немаленькой) для всех модулей программы заведен объект в котором собраны указатели на общие модели данных, подключение к бд и т.д., в том числе и на объект, отнаследованный от QSettings. В одном из модулей есть диалог для редактирования настроек, он просто в этот QSettings пишет изменеия, а модули читают настройки из него же.

1. Контроллер только вызывает методы ClientSqlQueryModel, а изменение не учитывает, так как ClientSqlQueryModel не возвращает данные, хотя позже потом планируется обработка ошибок...

2. А вот открываю я виджет настроек, изменяю их, а потом закрываю окно. И получается что при закрытии окна настройки должны сохраниться. А где это делать? В controller? Или в самом виджете настрек? Ведь если это делать в виджете это мне кажется не совсем правильно...


Название: Re: Вопросы по реализации
Отправлено: voronElf от Март 01, 2010, 10:22
1.
Цитировать
ClientSqlQueryModel не возвращает данные
именно котроллеру не возвращает ? ну тогда не вижу отступлений от MVC

2. Я сохраняю настройки в в самом виджете, редактирующем их (диалог, в методе accept() сохраняю). Не вижу ничего неправильного, т.к. поставщик данных для виджета тут QSettings выступает, в exec() я считываю настройки в поля диалога, в accept() я записываю поля обратно в поставщик данных (т.е. в QSettings).
Вот если кроме просто сохранения нужно еще кого то оповещать об изменениях настроек или т.п. (то что не входит в обязанности QSettings), тогда нужно контроллер вызывать (ну или чтото еще в зависимости от архитектуры). Но передавать значения из полей виджета в QSettings (чтоб он сохранил) , имхо, лучше в самом виджете.


Название: Re: Вопросы по реализации
Отправлено: lokoArt от Март 01, 2010, 10:36
1.
Цитировать
ClientSqlQueryModel не возвращает данные
именно котроллеру не возвращает ? ну тогда не вижу отступлений от MVC

Мда... А вот появился у меня вопрос: Например контроллер вызывает метод ClientSqlQueryModel, там что-то происходит.
И например я должен вызвать информационное сообщение, например QMessageBox. Как мне это сделать? А точнее где?


Название: Re: Вопросы по реализации
Отправлено: break от Март 01, 2010, 10:45
Цитировать
Нужно ли создавать наследника QSettings?
Нет не нужно никогда - он не предназначен для наследования, можно его агрегировать в свой класс или создать глобальные (а лучше в неймспейсе) ф-ции чтения/записи и зарегистрировать ему формат
Обоснование давалось здесь http://www.prog.org.ru/topic_12074_0.html

Цитировать
Я сохраняю настройки в в самом виджете, редактирующем их (диалог, в методе accept() сохраняю). Не вижу ничего неправильного, т.к. поставщик данных для виджета тут QSettings выступает, в exec() я считываю настройки в поля диалога, в accept() я записываю поля обратно в поставщик данных (т.е. в QSettings).
Если настройки используются в разных окошках, разных модулях программы ничего не знающих друг о друге - то можно иметь одну копию QSettings которую читаем при старте приложения, пишем при закрытии его. А пользуемся везде - изменяем, читаем  опции настроек.

Если есть AppManager(некоторый класс приложения экземпляр которого создается в main и например как синглтон и доступен везде) - то он может предоставлять доступ к QSettings


Название: Re: Вопросы по реализации
Отправлено: voronElf от Март 01, 2010, 10:53
Вызывать окошки в модели конечно будет нарушение mvc. Но модель может отсылать сигнал, который завязывается на слот, отображающий окно успешности. Слот логично прописать в виджете, который содежит вьюху для модели этой (ну или еще где-то, что за gui отвечает, не суть уже важно).

Ну а второй способ может быть такой: если в обязанности контроллера входит управление gui (думаю по архитектуре такое может быть, не знаю как у тебя) , то пусть контроллер после вызова метода модели вызывает MessageBox (успешность обработок по возвращаемым значениям из метода). Но эт как вариант.

Первый способ более гибок, особенно если операция важная для модели (в будущем по этим дейсвиям может понадобится не только MessageBox показать, а и какие-нибудь объекты посерьезнее уведомить, а сигнал уже заготовлен).


Название: Re: Вопросы по реализации
Отправлено: lokoArt от Март 01, 2010, 11:10
спасибо большое)))
А вот ещё вопрос один который меня мучает: Вот у меня есть виджет добавление клиентов, и мы вводим туда данные, а при нажатии на OK клиент добавляется.
А это делается так: При нажатии на OK посылается сигнал слоту который принадлежит этому виджету, а он уже вызывает метод controller.
Это правильно?

Вы бы как реализовали это?


Название: Re: Вопросы по реализации
Отправлено: break от Март 01, 2010, 11:44
Цитировать
А вот ещё вопрос один который меня мучает: Вот у меня есть виджет добавление клиентов, и мы вводим туда данные, а при нажатии на OK клиент добавляется.
А это делается так: При нажатии на OK посылается сигнал слоту который принадлежит этому виджету, а он уже вызывает метод controller.

при нажатии кнопки добавить контрагента - стартуем транзакцию, вставляем запись в таблицу контрагентов с дефолтными значениями - ИМЯ, ФАМИЛИЯ и т.д. и открываем через DataWidgetMapper свою формочку редактирования контрагента, когда все поля заполнены - в этой формочке если жмется OK - то commit, иначе rollback

если не хочется стартоваять транзакцию(с этим проблемы в стандартном драйвере) - можно на клиенте обойтись методами  модели submitAll(); revertAll();