© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
18 июля 2018 г. 11:20

Разделение интерфейса и логики приложения

Qt

Добрый день!
Возник такой интересный вопрос: хочется в программе, которая использует базы данных полностью или по максимуму разделить интерфейс и логику работы с самой базой данных.
С таблицами, выборками и поиском все ясно, их необходимо с использования QTableModel, QRelationTableModel и т.д. перевести на QSqlquery.
Вопрос в том как быть с полями редактирования данных (QLineEdit, QTextEdit и др.)?
Работа с ними организована при помощи QDataWidgetMapper. Выполнять запрос Sql и потом из него вытягивать результаты и раскидывать по нужным полям (по очереди в цикле) или есть другой вариант.
И как быть с тем, что таблиц много и писать под каждую свой запрос не очень то и хочется (это только для отображения данных в таблице, а еще и редактирование данных / отдельная форма с QLineEdit, QTextEdit и др. под каждую таблицу/ ).
Больше хочется сделать, что-то универсальное, чтобы не пришлось в классах форм писать что-то типа:
MyClass *class = new MyClass();
class.sql("SELECT ... FROM ...");

то-есть описывать сам запрос в классе формы.
Как можно поступить в данной ситуации?


Добрый день!

Ой зря Вы это затеяли. Модели данных - это как раз и есть логика, а всякие QTableView, QTableWidget - это представление, интерфейс приложения.
В рамках использования Qt, переводить всё на QSqlQuery - это неправильно, человек, который будет после вас поддерживать этот код, как первым делом займется тем, что будет обратно переписывать всё на модели.
Вы можете сделать классс фассад базы данных для чего-то совсем специфического, а для всего остального оставьте мапперы и модели. Они для этого и были придуманы и написаны, чтобы стандартизировать и упорядочить доступ к данным через интерфейс.


Спасибо, а то я чуть не согрешил :).
Фасад для подключения к базе данных написан ( спасибо за статью :) ).

P.S. Вопрос возник из-за просьбы вынести работу с базой данных в отдельный файл / файлы.

Проанализируйте, что именно можно вынести в качестве функционала, который не требует представления в виде таблиц или маппинга в диалоги. То и переносите.

Возможно потребуется что-то продублировать, чтобы получать вектор объектов или ещё что-то в этом роде. Но модели и мапперы оставьте, иначе наделаете себе уйму головной боли в будущем.
Все, что касалось подключения к базе, проверки логина и пароля и еще несколько аспектов работы с ней, вынес еще на начальном этапе.
Написал свой класс для форм (вынес в них общую логику), создал модели для QComboBox и QListView.
Уже остались только стандартные модели и мапперы. Значит больше выносить не чего.

Огромное спасибо еще раз !

Получается, что так. Успехов.

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 августа 2018 г. 19:02
Lord Inquisitoris

C++ - Тест 003. Условия и циклы

  • Результат 57баллов,
  • Очки рейтинга-2
15 августа 2018 г. 18:58
Lord Inquisitoris

C++ - Тест 005. Структуры и Классы

  • Результат 83баллов,
  • Очки рейтинга4
15 августа 2018 г. 9:29
Леха Завистович

C++ - Тест 001. Первая программа и типы данных

  • Результат 86баллов,
  • Очки рейтинга6
Последние комментарии
10 августа 2018 г. 13:40
Alex

Работа с триггерными функциями в PostgreSQL

Приветствую! Если вы создаете новую таблицу, почему бы просто не сделать вьюху ? Просто от одного названия "триггер" как-то не хочется его использовать, а уж кода сколько писа...
10 августа 2018 г. 11:46
Евгений Легоцкой

Bash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

Вон оно что. Не сталкивался с таким, надо будет глянуть исходники дефолтного менеджера объектов. Возможно там кеширование просто. Пробовали добавить запись через adminer, перезапусти...
10 августа 2018 г. 11:34
Alex

Bash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

допустим у нас есть любая таблица, созданная джангой. через админку добавляем пару записей. все ок. далее, лично в моем случае , я открываю adminer, и в эту таблицу добавляю еще одну зап...
Сейчас обсуждают на форуме
15 августа 2018 г. 14:06
Олег Корнев

Как подключить QtCharts в QML?

После некоторых манипуляций (переустановил креатор) смог запустить экземплы с использованием QtCharts, но все они работают с подключениями в файлах .pro .cpp, у меня таких файлов нет. Как...
14 августа 2018 г. 7:02
Ruslan-maniak

Переключение страниц и перевод фокуса на потомка новой страницы

Большое спасибо. Подтолкнули меня на мысль вынести обработку клавиш из PathView на всю страницу. И тогда - да, ваша подсказка работает. добавил в StackView onCurrentItemChanged: currentItem.fo...
14 августа 2018 г. 6:39
Евгений Легоцкой

Как сделать аудиовизуализацию для плеера на qt?

Добрый день. Просмотрите пример в Qt Creator, который на QML, там реализовано визуализация, возможно вам понравится использовать, QML, да и кастомные интерфейсы на нём всё-таки лучше...
11 августа 2018 г. 10:12
Евгений Легоцкой

Qt C++ vs QML

Добрый день. Если Андроид предполагается, то конечно нужно использовать QML. Я занимался разработкой арканоида на QML и ещё одной игры. Пытался реализовывать логику на QML, но это ...
11 августа 2018 г. 9:24
Евгений Легоцкой

Помогите со слоями

Проверочное сообщение

Рекомендуемые страницы