LINUX.ORG.RU

Как правильно реализовать такую прокси модель?

 ,


0

2

В общем есть модель которая в одной из своих колонок хранит специальную структуру. Мне нужно как-то ее транслировать в QTreeView. Т.е что-бы при выборе определенной строки в таблице оказывались данные из этой колонки. Как правильно это сделать? Где посмотреть пример?

UPD

Немного не так выразился. Есть QTreeView и QTableView. Один из столбцов QTreeView содержит структуру, мне надо ее отобразить в QTableView как таблицу(Наименование поля структуры: значение поля).

★★★★★

Последнее исправление: deterok (всего исправлений: 1)

Ответ на: комментарий от deterok

ну так никто не мешает сделать делегат вьюху табличную.

MikeDM ★★★★★
()

Зачем здесь прокси? Это разные модели вообще.

Создай отдельную модель для таблицы и свяжи её сигналами-слотами с treeview - когда выбирается индекс, меняется содержимое табличной модели.

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

Хм...
В общем-то да...
Мне просто ранее советовали прокси использовать
Ну ладно, попробую сейчас свою модель зарулить.

deterok ★★★★★
() автор топика

1. Единая модель для TreeView и TableView. Структуру хранишь как дочерние индексы в дереве в две колонки.

2. По выбору индекса в TreeView для TableView делаешь setRootIndex на выбранный индекс, тот который предок для твоей структуры.

3. PROFIT! В TableView отображаетмся то, что тебе надо

grondek
()

Один из столбцов QTreeView содержит структуру

У тебя столбцы должны не содержать структуры, а лишь их отображать.

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

Немного не понял 1.

У меня модель сейчас возвращает такие элементы в строке:
Строку|Строку|Структуру Естественно все в виде QVariant'ах.

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

И да, лучше это. Чтобы все тебя правильно поняли и могли дать разумный совет, надо определиться с моделью данных. Какие у тебя там сущности, какие у них поля, и как они взаимосвязаны.

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

Ну оно их не отображает, сейчас подробнее напишу:
Есть модель со следующими столбцами:
Строка|Строка|Структура

В дереве показываю первые 2. Теперь надо как-то 3 отобразить в виде таблицы в QTableView.

deterok ★★★★★
() автор топика
Последнее исправление: deterok (всего исправлений: 1)
Ответ на: комментарий от deterok

Пары <наименование поля> : <значение поля> в модели показываются как дочерние индексы третьего столбца. То есть модель такая:

Строка | Строка | Неважно что 
                       |
                       -->  <наименование поля> : <значение поля>
                       -->  <наименование поля> : <значение поля>
                       -->  <наименование поля> : <значение поля>

Соответственно, в TreeView третий столбец ты не показываешь, а в TableView третий стоблец стает rootIndex и показываются его дочерние индексы.

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

В смысле не столбец, а данные ячейки в данной строке находящийся на месте столбца.

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

Честно говоря это тяжело осознать без примера, но я в принципе понимаю.

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

Т.е. вы предлагаете сделать такой граф:

|-Строка | Строка | Неважно что 
|                       |
|                       -->  <наименование поля> : <значение поля>
|                       -->  <наименование поля> : <значение поля>
|                       -->  <наименование поля> : <значение поля>
|
|
|-Строка | Строка | Неважно что 
|     |                  |
|     |                  -->  <наименование поля> : <значение поля>
|     |                  -->  <наименование поля> : <значение поля>
|     |                  -->  <наименование поля> : <значение поля>
|     |
|     |
|     |-Строка | Строка | Неважно что 
|                             |
|                             -->  <наименование поля> : <значение поля>
|                             -->  <наименование поля> : <значение поля>
|                             -->  <наименование поля> : <значение поля>
|
|
|-Строка | Строка | Неважно что 
                       |
                       -->  <наименование поля> : <значение поля>
                       -->  <наименование поля> : <значение поля>
                       -->  <наименование поля> : <значение поля>

deterok ★★★★★
() автор топика
Последнее исправление: deterok (всего исправлений: 1)
Ответ на: комментарий от deterok

И опять покажу вот сюда: http://qt-project.org/doc/qt-4.8/model-view-programming.html

Одна модель (ФС) на два разных представления.

А «структура» - это что? Некий объект со своими полями?

Самый тупой вариант - ловить сигнал «выделение объекта» в дереве, получать по нему нужный объект (завернутый в QVariant через index.data()) или каким-нибудь ещё способом, и сообщать его в свою модель для QTableView (которая знает, как данный объект представить в виде набора строк/столбцов).

Будет просто и будет работать. Возможно, в твоем случае с твоей изначальной моделью большего действительно не надо.

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

У него, по всей видимости, листья (которые <наименование поля> : <значение поля>) не входят в саму древовидную модель, а просто представлены как какой-то свой объект.

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

Это тоже верно, но может быть слишком лихо =)

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

Да да да. Эти данные используются для дальнейших расчетов.

Спасибо за помощь в любом случае.

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

Да. В примитивном варианте ты из своей структуры строишь таких детей для «неважно что».

В сложном, но более правильном варианте делается так:

В «Неважно что» лежит твоя структура и в модели нет детей «<наименование поля> : <значение поля>».

Далее поверх строится прокси модель, которая твою структуру отображает как детей третьей колонки в виде «<наименование поля> | <значение поля>» (как у тебя на рисунке).

И уже эта прокси модель отображается в дереве и таблице.

То есть:

Модель:

|-Строка | Строка | Структура
|                       
|-Строка | Строка | Структура
|     |
|     |-Строка | Строка | Структура 
|
|-Строка | Строка | Структура 

Прокси модель:

|-Строка | Строка | Структура 
|                       |
|                       -->  <наименование поля> : <значение поля>
|                       -->  <наименование поля> : <значение поля>
|                       -->  <наименование поля> : <значение поля>
|
|
|-Строка | Строка | Структура 
|     |                  |
|     |                  -->  <наименование поля> : <значение поля>
|     |                  -->  <наименование поля> : <значение поля>
|     |                  -->  <наименование поля> : <значение поля>
|     |
|     |
|     |-Строка | Строка | Структура 
|                             |
|                             -->  <наименование поля> : <значение поля>
|                             -->  <наименование поля> : <значение поля>
|                             -->  <наименование поля> : <значение поля>
|
|
|-Строка | Строка | Структура 
                       |
                       -->  <наименование поля> : <значение поля>
                       -->  <наименование поля> : <значение поля>
                       -->  <наименование поля> : <значение поля>

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

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

Так что не парься и строй модель как ты нарисовал выше

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

Самое простое и рабочее я уже выше описал :) и E.

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