Russian Qt Forum
Ноябрь 24, 2024, 23:01
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Model-View (MV)
>
QAbstractTableModel и два представления: нужен совет...
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QAbstractTableModel и два представления: нужен совет... (Прочитано 16284 раз)
ритт
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #15 :
Январь 03, 2008, 20:50 »
схема "одна общая модель + 1-2 прокси-модели + 2 представления + дополнительные роли
Записан
Cyrax
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #16 :
Январь 03, 2008, 21:48 »
Цитировать
1-2 прокси-модели
1 прокси-модель, я так понимаю, - когда общая модель данных M заточена под одно из представлений (например, наследник QAbstractTableModel, работающий с представлением напрямую, не нуждается в прокси P_table) ?
(в данном случае понадобится одна прокси-модель P_tree для работы с представлением V_tree)
Таким образом, пусть модель M будет заточена под табличное представление V_table. Т.е. V_table пусть будет основным представлением, V_tree - дополнительным, нуждающимся в прокси-модели P_tree:
- одна общая модель M,
- одна прокси-модель P_tree для работы общей модели M с представлением V_tree,
- 2 представления V_table и V_tree.
Общая модель M работает с основным представлением V_table напрямую, с дополнительным V_tree - через прокси P_tree. Тогда:
1. При запросе/установке данных представлением V_table общая модель M работает с обычными индексами (индекс таблицы), соответствующими ячейкам таблицы и со стандартными ролями Qt.
2. При запросе/установке данных представлением V_tree прокси-модель P_tree индекс (индекс дерева) оставляет неизменным, а роль изменяет на одну из пользовательских (дополнительных) ролей.
Так ?
Записан
ритт
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #17 :
Январь 03, 2008, 22:06 »
неверно, начиная с понимания, что модели заточены под вьюхи
Записан
Tonal
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #18 :
Январь 03, 2008, 22:09 »
Я бы сделал так:
Реализовал слой логики, которая ничего о Qt может и не знать.
В этом слое есть твой хитрый контейнер, у которого есть методы для доступа как к таблице (имя атрибута, номер строки) и как к дереву (родитель, итератор по детям)...
Далее в логике представления рисуем модели, которые не имеют своих данных, а лишь обращаются к соответствующим методам доступа логики.
Записан
Cyrax
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #19 :
Январь 03, 2008, 23:06 »
Цитировать
неверно, начиная с понимания, что модели заточены под вьюхи
Именно. Тогда как архитектура/концепция "модель-представление" подразумевает абстракцию данных от представления...
xep
, касательно моего предыдущего поста - такую реализацию ты имелл вииду или нет ?
Или не думал над конкретикой/деталями ?
Цитировать
Я бы сделал так:
Реализовал слой логики, которая ничего о Qt может и не знать.
В этом слое есть твой хитрый контейнер, у которого есть методы для доступа как к таблице (имя атрибута, номер строки) и как к дереву (родитель, итератор по детям)...
Далее в логике представления рисуем модели, которые не имеют своих данных, а лишь обращаются к соответствующим методам доступа логики.
Все предлагаемые варианты крутятся вокруг одной схемы: "объект с общими данными + 2 представления + 2 промежуточных объекта".
Т.е. имеются следующие варианты:
1. общая модель M + 1 или 2 прокси-модели P_tree и P_table + 2 представления
2. общая модель M + 2 модели M_tree и M_table + 2 представления
3. класс с общими данными + 2 модели M_tree и M_table + 2 представления
Пока предлагаются "голые" варианты. А хотелось бы услышать преимущества и особенности предлагаемых вариантов...
3-й вариант мне пока больше нравится...
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #20 :
Январь 03, 2008, 23:36 »
Под вьюхи заточены прокси-модели, а не модель М. Модель М вообще не должна знать, как должны отображаться данные - она просто их содержит. А вот уже прокси-модели выгребают из М то, что надо показать во вьюхе.
Варианты 1 и 3 в принципе идентичны, если считать модель М этим самым классом с общими данными (он может быть вообще не Qt-моделью). Лично я бы так и делал - класс с данными и две прокси.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
ритт
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #21 :
Январь 04, 2008, 00:49 »
нет, не такую...
модель, две прокси-модели, две вьюхи
примера ради: одна прокся оперирует данными роли ДисплэйРоле, другая прокся - данными роли ЭдитРоле. соответственно, каждый индекс будет возвращать на ДисплэйРоле, например, название значения, а на ЭдитРоле - само значение...или наоборот...или же вообще провести свои роли. в таком случае та же таблмодель тебе даст массив не двумерный, а размерностью [столбцов * строк * кол-во уникальных ролей]
плюсы: модели срать с прибором на то, кто её пользует, в частности, её же можно использовать в связке с любыми кутэшными вьюхами; не надо "расширять интерфейс"; перестраивать индексы придётся только при скрытии строк/столбцов (прокси-модели это умеют и без тебя)
в идеале можно обойтись только наследованием модели эМ, а проксям тупо указать роль, с которой забирать дату по сырцо-индексам
из минусов: если в дереве действительно древовидное отображение (больше 1-2 дочерних нод), таблмодель в качестве модели эМ плохо подходит, т.к. будет ассертить на валидные парентИндексы
из перечисленных у тебя выше трёх вариантов второй - вообще непотреб. выбирать надо из первого и третьего - всё зависит от структуры/сложности исходных данных
Записан
Tonal
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #22 :
Январь 04, 2008, 09:43 »
2 Cyrax
Насколько я понимаю, мой вариант это №3 по твоей классификации.
Мы успешно его применяем.
Главное достоинство подхода - разделение обязанностей.
Если по пунктам, то примерно так:
1) Класс логики содержит только логику, без ненужных ему привязок к GUI да и вообще к Qt.
Соответственно тестировать, да и вообще использовать его можно совершенно отдельно от остального приложения (у нас, например, такие классы используются в разных конверторах)
2) Классы Qt моделей довольно просты и содержат только логику конвертации и стандартное представление дерева или таблицы соответственно, ошибок в них меньше, а писать проще.
Записан
Cyrax
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #23 :
Январь 04, 2008, 09:47 »
Блин, ну чё за язык: "срать с прибором", "забирать дату по сырцо-индексам".
Что такое "срать" ? Что такое "прибор" ? Что такое "сырцо-индекс" ?
Ничего не понятно...
Цитировать
примера ради: одна прокся оперирует данными роли ДисплэйРоле, другая прокся - данными
роли ЭдитРоле. соответственно, каждый индекс будет возвращать на ДисплэйРоле, например, название значения, а на ЭдитРоле - само значение...или наоборот
Что значит "оперирует данными роли..." ? Каждый из прокси передаёт/получает данные только для одной какой-то роли, а передачу/приём данных для других ролей игнорирует ?
Цитировать
или же вообще провести свои роли. в таком случае та же таблмодель тебе даст массив не двумерный, а размерностью [столбцов * строк * кол-во уникальных ролей]
xep
, у меня имена параметров указаны в горизонтальном заголовке таблицы. В первой строке таблицы указаны первые значения для всех параметров, во второй - вторые и т.д. В каждой ячейке расположено n-е значение (n-строка) некоторого параметра. Посему дополнительные роли для ячеек мне не нужны и двумерного массива будет достаточно.
Да и вообще задача заключается в том, что для одного и того же индекса и для одной и той же роли должны возвращаться/передаваться разные данные для табличного представления и древовидного представления.
Я не понимаю твою мысль. Если к стандартным ролям DisplayRole, EditRole, ToolTipRole и т.д., соответствующих табличному представлению, ввести дополнительные роли TreeDisplayRole, TreeEditRole, TreeToolTipRole и т.д. для древовидного представления, то никаких промежуточных моделей или прокси-моделей не понадобится - общая модель M при получении запроса будет исходить из ролей: если роли DisplayRole, EditRole, ToolTipRole и т.д., то возвращаем данные для табличного представления, если TreeDisplayRole, TreeEditRole, TreeToolTipRole и т.д., - для древовидного. Да и вообще, такая схема ролей - чушь какая-то.
Цитировать
плюсы: модели срать с прибором на то, кто её пользует, в частности, её же можно использовать в связке с любыми кутэшными вьюхами; не надо "расширять интерфейс"; перестраивать индексы придётся только при скрытии строк/столбцов (прокси-модели это умеют и без тебя)
Т.е. ставку в отношении плюсов делаешь на функциональность прокси-моделей. Но у меня по-любому перед представлениями будут стоять прокси-модели для фильтрации и сортировки данных. В случае чего, можно будет "перестраивать индексы придётся ... при скрытии строк/столбцов" этими прокси-моделями. А запихивать их функциональность по сортировке/фильтрации в прокси-модели P_table и P_tree, работающих с общей моделью M - не совсем правильно (т.е. разделение по функциональности в силу сильного различия их функций).
Цитировать
в идеале можно обойтись только наследованием модели эМ, а проксям тупо указать роль, с которой забирать дату по сырцо-индексам
Что значит "тупо указать роль, с которой забирать дату по сырцо-индексам" ?
Цитировать
из минусов: если в дереве действительно древовидное отображение (больше 1-2 дочерних нод), таблмодель в качестве модели эМ плохо подходит, т.к. будет ассертить на валидные парентИндексы
Не понял мысль. Мне по-любому придётся создавать две структуры данных: для таблицы (например, массив) и для дерева. При этом если общая модель будет основана на таблице или дереве, то по-любому придётся анализировать индексы и роли и по ним определять, от кого пришёл запрос - от таблицы или от дерева.
Таким образом, пока не указано ни одно серьёзное преимущество в пользу прокси-моделей P_tree и P_table по отношению к обычным моделям M_tree и M_table. Кроме того, что в прокси-моделях по-любому придётся реализовывать чистые виртуальные методы (не зависимо от необходимости этих методов), "заточку" этих прокси-моделей под дерево и под таблицу придётся реализовывать самому, поскольку QAbstractProxyModel наследуется от QAbstractItemModel, тогда как QAbstractTableModel уже имеет такую "заточку" под таблицу (ну а для дерева - также QAbstractItemModel)...
Пока только минусы...
Записан
Cyrax
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #24 :
Январь 04, 2008, 09:57 »
Tonal
, твой вариант пока лидирует.
Поскольку везкие аргументы в пользу прокси пока отсутствуют, то представляется такая схема:
- общий класс с данными, работающий с БД и содержащий в себе 2 структуры данных: табличную (для хранения
значений
параметров, отображаемых табличным представлением) и древовидную (для хранения иерархии, имён и характеристик параметров, отображаемых в древовидном представлении)
- две модели M_table (наследник QAbstractTableModel) и M_tree (наследник QAbstractItemModel)
- две прокси-модели P_tree и P_table, сортирующие и фильтрующие данные
- два представления V_tree и V_table
Собственно, отличная реализация принципа "разделения обязанностей"...
Записан
Tonal
Гость
Re: QAbstractTableModel и два представления: нужен совет...
«
Ответ #25 :
Январь 04, 2008, 10:09 »
Общий класс у нас обычно строиться таким образом:
Хеш объектов по id-у (у каждого объекта есть своё уникальный id) + несколько дополнительных структур (индексов) для быстрой индексации по выбранным атрибутам, или навигации по дереву подчинённости (если есть).
Каждый такой индекс содержит указатели на объекты из основного хеша.
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...