20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
|
||||||
1 | ||||||
Своя модель для QTreeView17.01.2015, 01:38. Показов 29108. Ответов 13
Метки нет (Все метки)
Хочу отобразить дерево...
модель: своя модель унаследованная от QAbstractItemModel. Представление: QTreeView, добавленное на форму. Данные: Пусть будет две строки добавленные в QStringList, обе являются итемами верхнего уровня, ну не считая самого верхнего... Будем только отображать, добавлять ничего не будем. Для наследования от QAbstractItemModel, нужно переопределить функции data(),index(),parent(),columnCount(),rowCount(). Код:
index() - я так понимаю, функция должна возвращать индекс текущего элемента, в createindex вместо parent я указал 0, хотя ведь должен быть предок, rootitem, в общем не понимаю, что при условии таких данных как у меня подавать сюда и как в целом описывать фукнкию. parent() - олжна возвращать индекс предка, но что у нас является предком? Предком должен быть один, невидимый rootitem, а его детьми как раз мои строки... columncount(); - тут все понятно, у меня всего две переменные оиднакового уровня расположенные в 1-й колонке rowcount(); тоже понятно, раз QStringList содержит две переменные одинакового уровня, то строки должно быть две, для текущего родителя (rootitem). После компиляции получаем QTreeView с двумя нашими строками, однако почему-то они отображают в виде стрелок, что у них есть потомки, при нажатии программа вылетает, при двойном щелчке по итему программа вылетает, почему? Как бы выглядел код, если бы первая строка str1 была child для rootitem, а str2 child для str1? Да, я смотрел Example в документации, но так и не понял, зачем они какой-то класс создают, а просто подать данные в модель нельзя? Без создания лишних классов, и там уже рассортировать, кто будет в списке parent, кто в списке child-ов
0
|
17.01.2015, 01:38 | |
Ответы с готовыми решениями:
13
Модель для QTreeView Модель для QTreeView от класса QAbstractItemModel Создать простую модель для QTreeView Редактирование данных в QTreeView и отпрака их в модель |
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
||||||
17.01.2015, 09:13 | 2 | |||||
Извини, но у тебя очень многое реализовано через ж. Есть хороший пример по поводу написания модели дерева. Есть само пояснение по структуре модель/вид. Прочти, если хочешь более внятно понять.
В этом пояснении, например сказано, что rowCount используется для подсчёта childrens в parent. Он применяется ко всем элементам. У тебя он всегда возвращает "2". Даже в том случае, когда вид запрашивает у модели есть ли у твоих строк их собственные дети. Твоя модель отвечает - да. Поэтому они у тебя и отображаются, как элементы, имеющие детей. Поэтому они и вылетают при нажатии - ведь вид пытается отобразить детей, которые не существуют. Конкретно с данной проблемой лучше переписать:
1
|
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
|
||||||||||||||||
19.01.2015, 13:55 [ТС] | 3 | |||||||||||||||
Хорошо, дерево где все элементы являются узлами верхнего уровня с этим все ясно.
Теперь давайте представим что у них появились подветки(child). Т.е. данными поступающими в модель в данном случае будут: QStringList parent_list <---тут две строки (parent_list.size() = 2), пусть они будут у нас элементами верхнего уровня и QStringList child_list <--- тут тоже две строки (child_list.size() = 2), пусть они будут подветками наших парентов. Не по теме: Или как-то по другому нужно организовать данные? Типа QMap<QString,QStringList>my_map? Опять же в модели унаследованной от QAbstractItemModel нам нужно переопределить методы data(),index(), parent(), ColumnCount(), RowCount()... Начнем с простого, колонка в любой ветке будет всего одна, соответственно:
Не успеваю дописать пост... позже продолжу... подсказывайте ежели что.. ))
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
19.01.2015, 14:12 | 4 |
Ты лучше приведи пример как должен в конечном итоге выглядеть твой список.
По поводу того, что данные можно размещать прямо в модели - да, можно. Модель и данные разделяются для того, чтобы в случае чего можно было проще изменять(или даже заменять) то или другое. Если тебе это не надо - можешь не разделять модель и данные.
0
|
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
|
|||||||
19.01.2015, 15:46 [ТС] | 5 | ||||||
Вот так должно в итоге выглядеть моё представление:
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
19.01.2015, 18:13 | 6 |
Извини за вопрос, но не могу не задать: а зачем такое извращение?
Без ответа на этот вопрос я тебе помочь не смогу - потому что определение parent происходит через внутреннюю структуру данных, а раз данные у тебя для всех одни и те же, следовательно и parent для них определить невозможно.
0
|
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
|
|||||||
19.01.2015, 19:37 [ТС] | 7 | ||||||
Не понял, а в чем тут извращение, простое дерево же...
Хорошо, давайте сделаем данные разные для разных парентов(1111 и 2222)...
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
19.01.2015, 20:17 | 8 |
Извращение - потому что непонятно зачем оно такое нужно и потому что это крайне трудно реализовать.
В данном случае используй стандартную модель QStandardItemModel. Точнее - наследуйся от неё и изменяй что тебе нужно. Или, если нужна какая-то своя модель - наследуйся от QAbstractItemModel и используй QStandardItem или наследников от неё. Или, если даже QStandardItem не удовлетворяет - пиши собственный класс данных. В любом случае - просто обойтись двумя таблицами тут не получится, здесь нужны данные, специально спроектированные под дерево.
0
|
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
|
|
19.01.2015, 22:41 [ТС] | 9 |
Т.е. унаследоваться от QAbstractTableModel и создать свою модель только для отображения в представлении QTableView просто.
А создать древовидную модель отнаследовавшись от QAbstractItemModel и отобразить результаты в представлении QTreeView сложно? Хм, а как же тогда отображают древовидные данные обычно? Неужели просто используя QStandardItemModel? А зачем наследоваться от QStandardItemModel, какую дополнительную функциональность можно добавить при наследовании?
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
19.01.2015, 23:26 | 10 |
QAbstractTableModel - это базовая модель для таблиц, в которой уже реализован функционал для таблиц. Вы же хотите функционал древовидной модели.
QAbstractItemModel это вообще базовая для всех моделей структура. Её ещё можно назвать интерфейсом. Поэтому в ней мало чего реализовано и вам придётся все её виртуальные функции реализовывать вручную. Для древовидных данных используют в качестве базового класса или QStandardItemModel или, если функционал её элементов(QStandardItem) вас не удовлетворяет, - QAbstractItemModel. В QStandardItemModel базовый функционал, в том числе и для деревьев - уже реализован. Но вы можете его изменить, если вас что-то не устраивает, переопределив виртуальные функции.
1
|
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
|
||||||
19.01.2015, 23:49 [ТС] | 11 | |||||
Странно, QAbstractListModel есть, QAbstractTableModel есть, а QAbstractTreeModel нет, точнее есть, но он называется QStandardItemModel...
Да нет, функционал QStandardItemModel меня полностью устраивает, просто как-то обидно, в QAbstractTableModel я переопределял все необходимые виртуальные функции, а тут на тебе, из коробки работает... Вопрос:
А для обработки clicked() только правой кнопкой мыши на item нужно переопределять представление (Treeview)?
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
|
20.01.2015, 00:16 | 12 |
Ничего странного нет. Просто смысла в нём никакого. Все абстрактные модели рассчитаны на работу с пользовательскими данными. И смысла в QAbstractTreeModel нет никакого, потому что в ней переопределять придётся ровно тоже функции, что и в QAbstractItemModel.
Работа с деревьями - она такая, наиболее сложная и комплексная. По хорошему надо новую тему открывать. Тут правило такое: один вопрос - одна тема. А зачем тебе по правому щелчку мыши? Он обычно для вызова меню используется. А так - можешь отслеживать нажатия mouseReleaseEvent(QMouseEvent * event) и затем определять элемент по indexAt(const QPoint & point). Тогда никакого переопределения QTreeView не потребуется.
0
|
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
|
|
23.01.2015, 12:16 [ТС] | 13 |
0
|
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
|
||||||
23.01.2015, 13:53 | 14 | |||||
Тогда тебе надо другое - сигнал void customContextMenuRequested(const QPoint & pos).
Создаешь слот, обрабатывающий его, подсоединяешь. Ну а дальше в слоте для определения элемента используй что тебе больше подходит - indexAt() или currentItem(). Пример:
0
|
23.01.2015, 13:53 | |
23.01.2015, 13:53 | |
Помогаю со студенческими работами здесь
14
Вставка значений из одного QtreeView в другое QTreeView Создание простой модели для QTreeView QTreeView и отображение одних и тех же элементов для разных категорий QSS: alternate-background-color у QTreeView с особым фоном для определенных элементов Одна модель данных (QStandardItemModel) для QTreeView и нестольких QComboBox Стиль для QtreeView::branch Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |