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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нужность моделей в неграфических приложениях  (Прочитано 6097 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« : Ноябрь 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, если на виджетах и так работает", "зачем мне всё это нужно, ведь можно сразу сделать один вариант и не париться". Просто хочу сделать максимально логично и красиво. А вот как максимально логично - пока не решил.

Проект пишется для себя, менеджеров над головой нет, сроки не парят Улыбающийся
« Последнее редактирование: Ноябрь 03, 2016, 10:15 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Ноябрь 03, 2016, 10:28 »

Модель содержит данные, а не отображает их, поэтому логично что в core.
Записан

DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #2 : Ноябрь 03, 2016, 10:35 »

С одной стороны - да, так оно и есть. С другой я пока не очень вижу, чем класс модели (в Qt-шном понимании) для задач, отличных от отображения, может пригодиться больше, чем структура, которую она использует внутри себя (допустим, там QList из структур...).
Записан

Мои проекты на Qt: DoubleContact, LInvert
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #3 : Ноябрь 03, 2016, 14:21 »

С одной стороны - да, так оно и есть. С другой я пока не очень вижу, чем класс модели (в Qt-шном понимании) для задач, отличных от отображения, может пригодиться больше, чем структура, которую она использует внутри себя (допустим, там QList из структур...).

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

Сообщений: 189


Просмотр профиля
« Ответ #4 : Ноябрь 03, 2016, 14:34 »

Таким образом одна модель может быть подменена любой другой.
В моей задаче, IMHO, с гораздо большей вероятностью может появиться другой View с той же Model, чем другая Model с тем же View. Улыбающийся

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

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #5 : Ноябрь 03, 2016, 15:24 »

Хм, но при этом QSortFilterProxyModel (да и её предок QAbstractProxyModel) - часть уже QtGui, а не QtCore...

Хотя это относится Qt4, в Qt5 уже перенесли в QtCore.
« Последнее редактирование: Ноябрь 03, 2016, 15:32 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #6 : Ноябрь 04, 2016, 19:08 »

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

Мои проекты на Qt: DoubleContact, LInvert
Bepec
Гость
« Ответ #7 : Ноябрь 04, 2016, 20:40 »

Цитировать
QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const.

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

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

Сообщений: 189


Просмотр профиля
« Ответ #8 : Ноябрь 04, 2016, 21:38 »

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

Мои проекты на Qt: DoubleContact, LInvert
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Ноябрь 04, 2016, 21:59 »

В моём случае я вряд ли буду так делать (тут это "слишком правильно"), но в более навороченных может пригодиться...
Лучше относится к Qt-моделям как к некоторым адаптерам между вашими данными и Qt-view. С их помощью view может отображать ваши данные, которые хранятся в своих структурах.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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