Russian Qt Forum

Qt => Model-View (MV) => Тема начата: DarkHobbit от Ноябрь 03, 2016, 10:12



Название: Нужность моделей в неграфических приложениях
Отправлено: DarkHobbit от Ноябрь 03, 2016, 10:12
Добрый день.
Как считаете, может ли быть польза от Qt-шных моделей в неграфических приложениях (утилиты командной строки, серверы)? В принципе, я смотрю, QAbstractTableModel, как и её предок - QAbstractItemModel - являются частью QtCore. Наверное, так сделано неспроста
Конкретный пример. У меня сейчас есть проект, в котором написано довольно много кода. До релиза ещё далеко, но поскольку я старался писать аккуратно и не валить всё в кучу, уже примерно выявилось, какие модули зависят от GUI, какие нет. И захотелось мне его структурировать примерно по такому принципу:
  • core - зависит только от QtCore. Туда пойдут структуры данных, общие процедуры, фильтры для разных форматов данных;
  • gui - зависит от QtCore и QtGUI. Первоначально хотел всунуть туда модель;
  • app - приложение, здесь остаётся весь код на виджетах.
Такое разделение, по идее, должно позволить сделать на одной кодовой базе:
  • прикладную программу на виджетах (использует всё);
  • прикладную программу на QML (использует core и gui);
  • консольный конвертор форматов для любителей unix-way (использует core)
В QML  я ещё толком не вник, но если правильно понимаю, мой потомок QAbstractTableModel пригодится как для программы на виджетах, так и для QML. Для неграфических программ пользы от модели пока не вижу, просветите, если я не прав (а интуиция, исходя из того, что я читал про MVC, подсказывает, что скорее всего, не прав). Соответственно думаю, куда же всё-таки сунуть модель - в core или в gui?

Просьба не спрашивать, "зачем тебе виджеты в 2016 году", "зачем тебе QML, если на виджетах и так работает", "зачем мне всё это нужно, ведь можно сразу сделать один вариант и не париться". Просто хочу сделать максимально логично и красиво. А вот как максимально логично - пока не решил.

Проект пишется для себя, менеджеров над головой нет, сроки не парят :)


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: gil9red от Ноябрь 03, 2016, 10:28
Модель содержит данные, а не отображает их, поэтому логично что в core.


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: DarkHobbit от Ноябрь 03, 2016, 10:35
С одной стороны - да, так оно и есть. С другой я пока не очень вижу, чем класс модели (в Qt-шном понимании) для задач, отличных от отображения, может пригодиться больше, чем структура, которую она использует внутри себя (допустим, там QList из структур...).


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: ssoft от Ноябрь 03, 2016, 14:21
С одной стороны - да, так оно и есть. С другой я пока не очень вижу, чем класс модели (в Qt-шном понимании) для задач, отличных от отображения, может пригодиться больше, чем структура, которую она использует внутри себя (допустим, там QList из структур...).

Модель предоставляет предопределенный интерфейс для взаимодействия с ней. Таким образом одна модель может быть подменена любой другой. Внутренняя структура становится неважной - в списках, в других видах коллекций или в БД данные находятся - все равно. Если использовать конкретную структуру хранения "(допустим, там QList из структур...)", то всегда будете работать только с ней.


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: DarkHobbit от Ноябрь 03, 2016, 14:34
Таким образом одна модель может быть подменена любой другой.
В моей задаче, IMHO, с гораздо большей вероятностью может появиться другой View с той же Model, чем другая Model с тем же View. :)

Тем не менее, спасибо, убедили, оставляю модель в core.


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: DarkHobbit от Ноябрь 03, 2016, 15:24
Хм, но при этом QSortFilterProxyModel (да и её предок QAbstractProxyModel) - часть уже QtGui, а не QtCore...

Хотя это относится Qt4, в Qt5 уже перенесли в QtCore.


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: DarkHobbit от Ноябрь 04, 2016, 19:08
И всё-таки не всё срастается...
Если в модели я использую Qt::BackgroundRole, то через него надо возвращать QBrush, который таки является частью QtGui.
Получается, что сами модели хоть и определены в QtCore, но при этом в программах без QtGui могут использоваться только при определённых ограничениях.
Всё же это не совсем модель в понимании MVC...


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: Bepec от Ноябрь 04, 2016, 20:40
Цитировать
QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const.

Он возвращает QVariant, а не brush или иное. Модель может отдавать ВСЁ ЧТО УГОДНО, что напишете то и отдаст. Начиная от int заканчивая псевдографикой.

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


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: DarkHobbit от Ноябрь 04, 2016, 21:38
Он возвращает QVariant, а не brush или иное. Модель может отдавать ВСЁ ЧТО УГОДНО, что напишете то и отдаст. Начиная от int заканчивая псевдографикой.
Я в курсе. И всё-таки, как я понимаю, Qt::BackgroundRole предполагает, что через QVariant возвращается именно QBrush.
Тогда, наверное, самый универсальный вариант - это сделать две модели. Одна, предок, работает только на текст, а внутренние структуры у неё protected. Другая - потомок, не гнушается и QtGui.
В моём случае я вряд ли буду так делать (тут это "слишком правильно"), но в более навороченных может пригодиться...


Название: Re: Нужность моделей в неграфических приложениях
Отправлено: Old от Ноябрь 04, 2016, 21:59
В моём случае я вряд ли буду так делать (тут это "слишком правильно"), но в более навороченных может пригодиться...
Лучше относится к Qt-моделям как к некоторым адаптерам между вашими данными и Qt-view. С их помощью view может отображать ваши данные, которые хранятся в своих структурах.