LINUX.ORG.RU

[Qt4] Model/View Programming


0

1

Мне требуется реализовать класс модели, описывающую следующую структуру: http://img143.imageshack.us/img143/8118/modelf.png

Таблица с определенным набором столбцов (параметры элемента). Содержит переменное количество строк (каждая строка описывает один элемент).

С этим проблем нет.

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

Чтобы было понятнее, опишу физический смысл.
Имеется динамический массив записей, каждая из которых описывает рейс самолета.
Параметры: идентификатор, время прибытия, аэропорт, точки маршрута.

Точки маршрута - еще один динамический массив, каждая запись которого описывает одну точки, со своими параметрами.

Подошли к сути вопроса.

Описав QAbstractTableModel я так и не понял как в ячейке описать еще одну таблицу.
Видимо надо строить дерево, но мне кажется, что оно больше подходит для однородных элементов, которые имеют родителя и детей.

От кого наследоваться, чтобы реализовать описываемую модель?
QAbstractItemModel? QStandardItemModel?

Сижу в выходной на работе и экспериментирую...
Буду благодарен тому, кто мне подскажет что-нибудь дельное.

Наследоваться от QAbstractItemModel. Если конкретная ячейка должна разбиваться на колонки - создаёте ей одну дочернюю строку с необходимым количеством колонок. Другое дело, что реализацию вида тоже прийдётся писать самостоятельно, я бы отнаследовался от QTableView.

Dendy ★★★★★ ()
Ответ на: комментарий от Dendy

Присмотрелся внимательнее, да, создавать не одну строку, а сколько нужно, собственно, как вы и предложили - таблица в ячейке (индексе).

Dendy ★★★★★ ()

если я правильно понимаю, чего вы хотите, и под «таблицами» вы симели в виду нечто, отображаемое на БД, то попробуйте использовать SqlTableRelationalTableModel. Связи с другими таблицами делаются с помощью setRelation

eldjarn ()
Ответ на: комментарий от eldjarn

> если я правильно понимаю, чего вы хотите, и под «таблицами» вы симели в виду нечто, отображаемое на БД, то попробуйте использовать SqlTableRelationalTableModel. Связи с другими таблицами делаются с помощью setRelation

А БД никакого отношения это не имеет.
Работа ведется с сегментом разделяемой памяти, в которой хранятся массивы структур.

Fredrik ()
Ответ на: комментарий от Dendy

> Наследоваться от QAbstractItemModel. Если конкретная ячейка должна разбиваться на колонки - создаёте ей одну дочернюю строку с необходимым количеством колонок. Другое дело, что реализацию вида тоже прийдётся писать самостоятельно, я бы отнаследовался от QTableView.

Печально. Я надеялся на то, что можно обойтись стандартным QTreeView.

Fredrik ()

А. Я вас неправильно понял, кажется. Если нужно в одной вьюхе иметь мастер-деталь, то вам предстоит весёлый церебральный секс.

Идти нужно будет аж от абстрактной модели, если красиво, и это будут только цветочки. Хотя для начала можно воспользоваться StandartModel, иерархический ModelIndex там есть.

А вот вьюхи, которая позволила бы показывать деталь внутри ячейки, Qt нам не даёт. Так что идти прямо от AbstractItemView и дай вам Бог терпенья. Ну или взять TreeView, немного его откастомить, и смириться с тем, что деталь у вас - набор листов дерева, и это видно невооружённым взглядом. Выглядеть и вести себя оно будет отвратно, разумеется. Мы пробовали.

PS: если у вас получится сделать прилично выглядящий master-detail, и не откажетесь поделиться кодом или хотя бы описанием решения, повешу на доску почёта ваш аватар и заставлю команду возносить ему хвалу каждый раз, когда эта вьюха будет использоваться:)

eldjarn ()

В ответ на нормально выглядящий мастер-дитейл смогу предложить нормально себя ведущую relationalmodel, не форсящую inner join и constraint restricted, и убирающую удалённые строки из вьюхи когда это необходимо, а не когда коммит в БД прошёл.

Она ещё не сделана, но никуда мы не денемся без неё, придётся писать.

eldjarn ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.