Arrow
Arrow18 июля 2018 г. 7:20

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

Qt

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

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


Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 19 июля 2018 г. 3:38

Добрый день!

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


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

    P.S. Вопрос возник из-за просьбы вынести работу с базой данных в отдельный файл / файлы.
      Evgenii Legotckoi
      • 19 июля 2018 г. 4:47
      • Ответ был помечен как решение.

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

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

        Огромное спасибо еще раз !
          Evgenii Legotckoi
          • 19 июля 2018 г. 4:57

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

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            г
            • ги
            • 24 апреля 2024 г. 1:51

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

            • Результат:41баллов,
            • Очки рейтинга-8
            l
            • laei
            • 23 апреля 2024 г. 19:19

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:10баллов,
            • Очки рейтинга-10
            l
            • laei
            • 23 апреля 2024 г. 19:17

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

            • Результат:50баллов,
            • Очки рейтинга-4
            Последние комментарии
            k
            kmssr9 февраля 2024 г. 5:43
            Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий Кононенко5 февраля 2024 г. 12:50
            Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVA25 декабря 2023 г. 21:30
            Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJo25 декабря 2023 г. 19:38
            Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            Gvozdik19 декабря 2023 г. 8:01
            Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Сейчас обсуждают на форуме
            G
            Gar22 апреля 2024 г. 15:46
            Clipboard Как скопировать окно целиком в clipb?
            DA
            Dr Gangil Academics20 апреля 2024 г. 17:45
            Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
            a
            a_vlasov14 апреля 2024 г. 16:41
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
            Павел Дорофеев
            Павел Дорофеев14 апреля 2024 г. 12:35
            QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
            f
            fastrex4 апреля 2024 г. 14:47
            Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

            Следите за нами в социальных сетях