Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Табличное представление для иеррархической модели
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Максим
Возможно ли стандартными средсвами Qt отобразить иеррархическую модель в виде таблицы следующего вида:
| root1 |
_______________________
| child1| child2| child3 |
_______________________
| root2 |
_______________________
|child1 | child2 |
_______________________
(прошу прощения за мою псевдографику)
Либо имеется ли возможность указать стандатному табличному представлению посредством модели какие именно строчки должны быть обьеденены/разбиты.
Ответ нет тоже впринцепе принимается, т.к. я пока и сам пришел к такому выводу, но особого желания писать свое представление пока нет, так что если существуют сторонние компоненты решающие мою задачу, буду только рад.

Всем спасибо за ответы, всех с Новым Годом :)
Litkevich Yuriy
не понял сути. Нужны объединённые ячейки в таблице?
novichkov
Можно попытаться написать прокси-модель, которая транслирует parent items в первый столбец строки, а child items в строку ниже. Только мне самому ни за что такое не написать.
Максим
Нужно дерево
| root1
| |____child2
| child1
|
| root2
|____________
| | |
| | |
child1 child2 child3
представить в виде таблицы, как это было указанно в предыдущем посте.
Вариант с прокси моделью я рассматривал, и он вполне бы подошел, если бы было средство с помощью модели задать какие строки в представлении будут обьеденены.
Я такого способа не нашел, как и готовых некомерческих компонентов, и думаю, что в таком случае, проще будет реализовать свое представление, возможно на основе QTableView, или возможно комбинированное решение из прокси модели и наследника QTableView обрабатывающего некую роль которая и будет хранить значение сколько строк обьединить и какие индексы показать.
Если будут какие то советы по реализации или по дизайну буду очень рад услышать.
Да кстати ещё одно ограничение версия Qt 4.5.3.
vankleef
Иерархическая модель не предназначена для представления в табличном виде. Это теория.
Думаю, что легче будет сделать класс, который дерево будет рисоавть.
Максим
Цитата(vankleef @ 8.1.2012, 19:27) *
Иерархическая модель не предназначена для представления в табличном виде. Это теория.
Думаю, что легче будет сделать класс, который дерево будет рисоавть.

Насчет 1 утвержения не согласен, т.к. любое обединение ячеек обычно уже свидетельствуе о более сложной структуре нежели просто таблица. Насчет непредназначенности тоже очень спорно т.к. тот же Altova Style Vision (читай xslt или XQuery) вполне способен представить дерево наверное даже и любой сложности в виде таблицы например html, т.к сути таблица всё таки дерево, таблица без обьединенных или разбитых ячеек частный случай дерева, по крайней мере её можно так рассматривать.
Насчет класса который рисует дерево, во 1 он уже есть, но рисует именно как дерево и по другому рисовать его заставить довольно трудозатратно. Реализовать свой класс, было бы конечно не дурно, но тот же библиотечный класс например состоит примерно из 3500 строк кода притом довольно компактного, что согласитесь, повторить потребует довольно много времени.
Вообщем если кому интересно или может пригодиться когда нибудь здесь мой вариант на коленке который будет вполне сносно выполнять мою текущую задачу ессно после небольшого допиливания. Алгоритмы отображения из иеррархической модели в табличную я уверен крайне не эффективны но в рамках моей задачи это не критично(количество элементов ~=100 +- 50) к каким событиям приделать перерисовку спанов тоже не придумал, пока вызываеться в ручную. Вообщем As Is.
Использован был всё таки вариант с прокси моделью и QTableView, так же пришлось ввести дополнительный контроллер отвечающий за перерасчет спанов(кстати тоже крайне не эффективный тупо всё и сразу:)).
Вообщем если будут дельные предложения по усовершенствованию милости прошу.
Tonal
Так а чем не устраевает QTreeView, специально заточенный под отображение иерархий?
Максим
Не устраивает тем, что по требованиям заказчика таблицы документа должны редактироваться именно в виде таблиц:).
Tonal
QTreeView редактируется так же как и QTableView.
Кроме того, оба могут показывать много колонок.
Что именно не устраивает в редактировании QTreeView?
Максим
Не устраивает именно внешний вид QTreeView, пользователь должен видеть перед глазами таблицу, а не дерево ибо таковы требования заказчика.
FantasyOr
если такое представление:


устроит заказчика, то дело можно поправить так: переопределите
    QVariant data ( const QModelIndex & item, int role = Qt::DisplayRole ) const
    {
        QVariant res;        
        if (!item.isValid())
            return res;
        
        res = QSqlTableModel::data(item, role);

        if (role == Qt::DisplayRole)
        {
            if (treeColumn.contains(item.column()))
            {

                if (QSqlTableModel::data(item.sibling(item.row()-1, item.column()) , role ) == res)
                {
                    res = QVariant();
                }
            }
        }

        return res;
    }


т.е. если предыдущая ячейка содержит то же самое, то выводим её как пустую, все данные естественно остаются в модели, а вот отображение изменяется

treeColumn это Set<int> тех колонок в которых должен быть такой фокус.

ВАЖНО!!!! осторожно с сортировкой и фильтрами
Максим
Спасибо за ваше предложение, но выглядеть таблица должна максимально приближенна к виду таблиц в excel, храниться будут данные разных типов, структура данных, т.е уровень вложености и количество столбцов на заданном уровне вложенности будет меняться пользователем, да и сортировка с фильтрацией будут необходимы.
Так что боюсь все таки придется пока что то решение которое есть а дальше или придумывать что - то новенькое либо оптимизировать существующее. Единственное что греет душу обьем данных будет небольшим, что позволяет исползовать различные малопроизводительные костыли.
FantasyOr
QUOTE (Максим @ 18.1.2012, 18:37) *
1) максимально приближенна к виду таблиц в excel,
2) храниться будут данные разных типов,
3) структура данных, т.е уровень вложености и количество столбцов на заданном уровне вложенности будет меняться пользователем,
4) да и сортировка с фильтрацией будут необходимы.


комментарии:
1) это у меня не прорисована сетка(не красиво на мой взгляд), выделяю только цветом через строку, вкл/выкл сетки - метод setShowGrid(bool) у QTableView. Другое цветовое выделение решается по средствам переопределения роли "BackgroundRole" в функции data модели данных:
Раскрывающийся текст
  switch (role)
  {    
    case Qt::BackgroundRole: {...} break;
  }



2) в моделе данные хранятся в QVariant, т.ч. этой проблемы не существует, хоть картинки или видео, главное написать правильный делегат

3) не могу себе представить, чтоб в 1 таблице(виджете view) отображались в одной колонке разные данные, а подпись колонок какая тогда будет? может я не правильно понял?

4) тут я подумал что можно переопределить дату у прокси модели, а не у модели данных, тогда не должно быть проблем с сортировкой и фильтрами.

По поводу фильтрации и сортировки: я пользуюсь QxtSortFilterProxyModel сайт Qxt- она умеет фильтровать по нескольким столбцам одновременно, Qt'шная этого не умеет.


если хочется всё как в экселе, то может перейти на VisualBasic написать макросы для работы с базой?(это не издёвка, просто вдруг так будет легче)
Максим
Цитата
2) в моделе данные хранятся в QVariant, т.ч. этой проблемы не существует, хоть картинки или видео, главное написать правильный делегат.

Не совсем точно наверное выразился, данные находящиеся в конкретной ячейке будут обладать разными свойствами, например будет такой тип данных как индикатор, отображающий результат проверки других данных , при их изменении,(знаю что реализация тривиальна),которые будет определять пользователь, при создании шаблона документа.
Цитата
3) не могу себе представить, чтоб в 1 таблице(виджете view) отображались в одной колонке разные данные, а подпись колонок какая тогда будет? может я не правильно понял?

Таблица, а представляться будет именно таблица документа, будет иметь однин общий заголовок верхнего уровня(собственно и определяющий максимальное количество колонок) и вложенную структуру из заголовков, подзаголовков и данных подзаголовков, при этом каждый заголовок может содержать как заголовки, так и подзаголовки, а так же иметь итоговую строку и опционально строку подписи.
Цитата
4) тут я подумал что можно переопределить дату у прокси модели, а не у модели данных, тогда не должно быть проблем с сортировкой и фильтрами.

Для сортировки, думаю будет использоватся кастомная прокси модель, т.к. как сортировать вышеизложенную структуру разом в табличном представлении я не очень хорошо себе представляю.

Цитата
если хочется всё как в экселе, то может перейти на VisualBasic написать макросы для работы с базой?(это не издёвка, просто вдруг так будет легче)

Как ни странно я тоже предлагал такое решение, но начальство хочет больше денег, а заказчик хочет видеть за что он отдает эти деньги:) Хотя решение с использованием оффисного пакета в данной задаче снимало бы целый ряд вопросов, начиная от внешнего вида , заканчивая реализацией алгоритмов обработки данных.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.