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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопросы по реализации  (Прочитано 4188 раз)
lokoArt
Гость
« : Март 01, 2010, 08:49 »

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

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

Записан
voronElf
Гость
« Ответ #1 : Март 01, 2010, 09:15 »

1. controller кому-то потом эти данные предоставляет ? если да, то в каком виде.
    сообщения от модели об изменениях данных учитываешь в котнроллере (и нужны ли они) ?

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

Цитировать
Обращаться к controller или нет?
Смотря какую роль выполняет controller. У меня в одной проге (немаленькой) для всех модулей программы заведен объект в котором собраны указатели на общие модели данных, подключение к бд и т.д., в том числе и на объект, отнаследованный от QSettings. В одном из модулей есть диалог для редактирования настроек, он просто в этот QSettings пишет изменеия, а модули читают настройки из него же.
Записан
lokoArt
Гость
« Ответ #2 : Март 01, 2010, 09:49 »

1. controller кому-то потом эти данные предоставляет ? если да, то в каком виде.
    сообщения от модели об изменениях данных учитываешь в котнроллере (и нужны ли они) ?

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

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

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

2. А вот открываю я виджет настроек, изменяю их, а потом закрываю окно. И получается что при закрытии окна настройки должны сохраниться. А где это делать? В controller? Или в самом виджете настрек? Ведь если это делать в виджете это мне кажется не совсем правильно...
Записан
voronElf
Гость
« Ответ #3 : Март 01, 2010, 10:22 »

1.
Цитировать
ClientSqlQueryModel не возвращает данные
именно котроллеру не возвращает ? ну тогда не вижу отступлений от MVC

2. Я сохраняю настройки в в самом виджете, редактирующем их (диалог, в методе accept() сохраняю). Не вижу ничего неправильного, т.к. поставщик данных для виджета тут QSettings выступает, в exec() я считываю настройки в поля диалога, в accept() я записываю поля обратно в поставщик данных (т.е. в QSettings).
Вот если кроме просто сохранения нужно еще кого то оповещать об изменениях настроек или т.п. (то что не входит в обязанности QSettings), тогда нужно контроллер вызывать (ну или чтото еще в зависимости от архитектуры). Но передавать значения из полей виджета в QSettings (чтоб он сохранил) , имхо, лучше в самом виджете.
Записан
lokoArt
Гость
« Ответ #4 : Март 01, 2010, 10:36 »

1.
Цитировать
ClientSqlQueryModel не возвращает данные
именно котроллеру не возвращает ? ну тогда не вижу отступлений от MVC

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

Сообщений: 846


Просмотр профиля
« Ответ #5 : Март 01, 2010, 10:45 »

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

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

Если есть AppManager(некоторый класс приложения экземпляр которого создается в main и например как синглтон и доступен везде) - то он может предоставлять доступ к QSettings
Записан
voronElf
Гость
« Ответ #6 : Март 01, 2010, 10:53 »

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

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

Первый способ более гибок, особенно если операция важная для модели (в будущем по этим дейсвиям может понадобится не только MessageBox показать, а и какие-нибудь объекты посерьезнее уведомить, а сигнал уже заготовлен).
Записан
lokoArt
Гость
« Ответ #7 : Март 01, 2010, 11:10 »

спасибо большое)))
А вот ещё вопрос один который меня мучает: Вот у меня есть виджет добавление клиентов, и мы вводим туда данные, а при нажатии на OK клиент добавляется.
А это делается так: При нажатии на OK посылается сигнал слоту который принадлежит этому виджету, а он уже вызывает метод controller.
Это правильно?

Вы бы как реализовали это?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #8 : Март 01, 2010, 11:44 »

Цитировать
А вот ещё вопрос один который меня мучает: Вот у меня есть виджет добавление клиентов, и мы вводим туда данные, а при нажатии на OK клиент добавляется.
А это делается так: При нажатии на OK посылается сигнал слоту который принадлежит этому виджету, а он уже вызывает метод controller.

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

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


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