Russian Qt Forum

Qt => Общие вопросы => Тема начата: lokoArt от Ноябрь 28, 2009, 11:58



Название: Проектирование
Отправлено: lokoArt от Ноябрь 28, 2009, 11:58
Привет всем!!! Пишу программу с GUI. При нажатии кнопки на каком либо виджете конечно же должны срабатывать какое-либо событие. Подскажите как лучше это сделать.

Варианты:
1. В каждый класс виджета включать объект класса, который выполняет действия, свойственые для этой формы.
2. В каждом классе виджета писать функции которые что-либо выполняют.

Или подскажите другие варианты которые буду лучше)))Заранее спасибо!


Название: Re: Проектирование
Отправлено: lit-uriy от Ноябрь 28, 2009, 15:20
виджет должен выполнять свою функцию полностью и не более того.


Название: Re: Проектирование
Отправлено: lokoArt от Ноябрь 28, 2009, 15:46
Значит лучше в виджет встраивать объект класса, который будет что-то делать?


Название: Re: Проектирование
Отправлено: lit-uriy от Ноябрь 28, 2009, 15:48
нет, просто виджет должен выполнять свою функцию. Т.е. определись с функциональностью виджета.


Название: Re: Проектирование
Отправлено: lokoArt от Ноябрь 28, 2009, 15:54
Ну у меня например виджет должен отправлять заросы к базе данных... Получается что у меня должна быть в нём функция которая это делает?


Название: Re: Проектирование
Отправлено: lit-uriy от Ноябрь 28, 2009, 18:53
опиши этот виджет, как он выглядит (можешь выложить его снимок)?


Название: Re: Проектирование
Отправлено: lokoArt от Ноябрь 28, 2009, 19:25
Вот он.... При нажатии на OK мы должны обратиться к базе данных и вернуть список найденных клиентов)))


Название: Re: Проектирование
Отправлено: spectre71 от Ноябрь 28, 2009, 19:28
Ну у меня например виджет должен отправлять заросы к базе данных... Получается что у меня должна быть в нём функция которая это делает?

Виджет точно никому  ничего не должен. :)

Можно конечно сделать по всякому, но лучше для работы с базой данных иметь отдельную сущность(класс или классы).
А виджет может:
1) получить указатель на нужный объект/объекты и вызывать его методы на те или иные управляющие команды(сигналы своих контролов) со своей стороны, получать нужную инфу из объекта и отображать ее в своих контролах, ..
2) может не знать ничего об объектах работающих с запросами, но посылать им и получать от них те или иные сигналы. А связать между собой сигналы/слоты виджета и объектов может как виджет, так и объект или другой объект не выполняющий запросы, а конторолирующий взаимодествие виджета с объектом запросов.
3) может быть смешанные 1-й и 2-й вариант
Итд......

Все зависит от задачи, от твоих знаний, привычек, стиля итд.

Придумывать вариантов можно много. Просто начни писать, а там поймешь что к чему и если что пределаешь. А абстрактно рассуждать безсмысленно.




Название: Re: Проектирование
Отправлено: spectre71 от Ноябрь 28, 2009, 19:37
Вот он.... При нажатии на OK мы должны обратиться к базе данных и вернуть список найденных клиентов)))
- Если диалог модальный, то можно например после выхода из него по "ОК" считать информацию из его полей и инициализировать ей объект работающий с запросами, вызвать у него соответствующий метод для отправки запроса, итд...
- Если не модальный, то видимо лучше перед вызовом диалога передать ему указатель на объект выполняющий запросы и соответственно инициализацию объекта данными и посылку запроса делать в слоте для кнопки "ОК"
Это простые варианты.


Название: Re: Проектирование
Отправлено: lokoArt от Ноябрь 28, 2009, 19:44
диалог модальный)))


Название: Re: Проектирование
Отправлено: lit-uriy от Ноябрь 28, 2009, 23:25
lokoArt, Насчёт данного диалога, лучше сделать так как предлагает Spectre для модального диалога. Тогда ты можешь этот диалог использовать во многих приложениях.

А по самой программе тоже могут быть варианты:
- Реализовать основные алгоритмы программы в наслединке Qwidget или QMainWindow или QApplacation
- Реализовать основные алгоритмы программы в наследнике QObject и в нём создавать объекты графического интерфейса (их логика взаимодействия может быть реализована в них самих)

Первый вариант быстрый и привычный (так построены многие примеры Qt), второй вариант позволяет перерабатывать программу более основательно, например превратить её из ГПИ в консольное приложение, читающее данные из конфигурационного файла или из потока ввода.


Название: Re: Проектирование
Отправлено: nixman05 от Ноябрь 28, 2009, 23:50

В интерфейсных классах следует определять только интерфейс пользователя, а также  программые интерфейсы взаимодействия с другими обьектами программы.
Обращение же к файлам, базам данных и т.п. следует реализовывать в отдельных классах-сущностях.  Взаимодействие интерфейса и сущности следует организовывать с использованием контролера.

т.е. н.п. В классе диалогового окна определены сигналы отправки данных, сигнал запроса получения данных...
слот сохранения данных, слот подготовки данных к отправке...

в классе сущности слоты сохранения и загрузки данных из БД
а также сигнал для отправки данных

в контролере происходит соединение соответствующих сигналов и слотов.