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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Какую структуру программы вы делаете при использовании QML?  (Прочитано 5941 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Август 25, 2018, 13:43 »

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

Это выражалось в том, что, например, C++ оповещал QML об измнении отображаемых в интерфейсе значений через сигналы. Не QML запрашивал изменения значений, не классы регистрировались с Q_INVOKABLE, чтоб значения в QML сами менялись, а именно C++ код за всем следил.

И вот думаю, что надо отходить от такой структуры. А новую до конца все никак придумать не могу.

В связи с чем вопрос: кто как строит свои проекты с использованием QML?
Записан

Собираю информацию по крупицам
http://webhamster.ru
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Сентябрь 18, 2018, 22:24 »

Мне видится такая структура:

View <-> Presenter -> Model -> Repository

В этой схеме:
View - это интерфейс на QML,
Presenter - связующее звено между вьюхой и моделью, формирует данные для вьюхи, получаемые из модели. Реализует всю UI логику вьюхи и навигацию.  Его можно реализовывать и в QML и на плюсах, по вкусу.
Model - это некие сервисы и объекты данных, реализующие логику приложения без привязки к пользовательскому сценарию. Сервисы получают данные через репозитории, абстрагируясь от конкретных реализаций.
Repository - это конкретные источники внешних данных (сетевые запросы, БД, QSettings, файлы)

В этой схеме главным должен быть Presenter, остальные его подчиненные.

Можно обойтись без Presenter и всю UI логику воткнуть во вьюху, как это обычно делают, но тогда вьюха получается грязной, верстка с кодом вперемешку.
Также имея отдельный невизуальный Presenter мы можем писать unit тесты без инстанцирования контролов.

Все вот думаю запилить демо приложение, реализующее такую архитектуру, но руки не доходят.
« Последнее редактирование: Сентябрь 18, 2018, 22:29 от navrocky » Записан

Гугль в помощь
NoIdea
Новичок

Offline Offline

Сообщений: 12


Просмотр профиля
« Ответ #2 : Октябрь 10, 2018, 00:11 »

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

Модели данных и объекты подхватываются и создаются динамически через qml-синглтон из директории dummydata, в котором находятся qml-файлы имитирующие модели и объекты C++, которые в коде программы реализованы в виде отдельных классов (QObject) с набором свойств, данных и методов, сигналов/слотов если надо.

Такой подход позволят запускать и отлаживать сложный интерфейс столько сколько нужно без пересборки и перезапуска программы - это очень удобно и экономит много времени, хоть и требует создание dummy с заглушками на методы и фейковыми данными...
« Последнее редактирование: Октябрь 10, 2018, 00:23 от NoIdea » Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #3 : Апрель 20, 2021, 11:48 »

Цитировать
Presenter - связующее звено между вьюхой и моделью, формирует данные для вьюхи, получаемые из модели. Реализует всю UI логику вьюхи и навигацию.  Его можно реализовывать и в QML и на плюсах, по вкусу.
Presenter  должен быть на плюсах, ибо он один для разных видов. Например, QML и консольный интерфейс.

Цитировать
При создании интерфейса на QtQuick делал упор на то чтобы каждый элемент и каждое окно отображались и работали отдельно от программы, т.е. можно запустить весь интерфейс или отдельный элемент через qmlscene и проверить его работу.
...
Очень стояще! Делаю примерно также, только всегда подаю на вход вида модель или класс бизнес-логики. Сразу видно от чего зависит вид.
Код:
Dialog {
    required property Week week  // класс бизнес логики
    ...
}
Создаю, соответственно, динамически
Код:
            var component = Qt.createComponent("WeekInfoDialog.qml")
            var object = component.createObject(appWindow, {week: currentWeek})
Но я только начал использовать QML.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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