LINUX.ORG.RU

Хочу некоторых прояснений на тему QAbstractItemModel + QTreeView.


0

1

В целом всё работает, но не очень понял, как ветвления в дереве фигачить? Надо для ячейки, представленной заданным QModelIndex, из которой должно расти поддерево, вернуть валидный QModelIndex из вызова QAbstractItemModel::parent(), отвечающий за «корень» растущего из этой ячейки поддерева что-ли? А для всех остальных ячеек, откуда поддеревьев не растёт, возвращать просто невалидный QModelIndex из этого вызова? Так? Или parent тут ни при чём?

Я тут пытаюсь скрестить boost::property_tree с этой кутешной моделью, чтобы через QTreeView конфиги редактировать.

★☆

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

Посмотри же Simple Tree Model Example.
Вообще, всё нужно реализовывать правильно: index, parent, rowCount и columnCount.

rival ★★
()

в parent ты должен возвращать родителя, значит невалидный индекс он должен возвращать только для тех элементов, что находятся в корне.
rowCount - количество элементов-потомков в рамках переданного parent-а. возвращаешь 0 - значит у элемента нету потомков.

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

Я куею от этой логики. Уже 3 дня сижу и волосы в желудке растут.

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

Не понимаю, зачем ему parent-то нужен? Почему индексами-то нельзя обойтись? Зачес спрашивать у меня сначала индекс нужной ячейки, а потом ещё ОЦЦА этой ячейки? Он чо, этот View, совсем дурак, он же когда index спрашивает, он ведь отца всегда предъявляет. Сначала предъявляет отца для получения индекса, а потом для полученного индекса спрашивает оцца. Чё за хрень? Что они курили?

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

> Не понимаю, зачем ему parent-то нужен?
http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/itemviews/qtreeview.cpp#line1095
http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/itemviews/qtreeview.cpp#line1519

Как можешь заметить, индекс в этих методах дается извне, они не получают его из модели, так что нет никакого parent'а, который «всегда предъявляется». А по первой ссылке и вовсе проход по всем родителям до корня.
В чем сложность-то реализовать и parent и index для модели?

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

Я исхожу не из кода, который ясное дело, самим своим существованием и фактом того, что он работает непогрешим. Я пытаюсь понять, почему этот код стал таким, у меня примерно такая логика: нафига нужен вызов parent(), если QTreeView при рисовании дерева всегда спускается снизу вверх (с корневого парента). Таким образом, QTreeView спускаясь по дереву вниз всегда знает парентов всех элементов. Видимо решили не хранить внутри QTreeView информацию о парентах - мол пускай QAbstractItemModel нам её сообщает, если мы попросим.

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

Возникла другая проблема. В модели есть тупой вызов flags такого вида:

Qt::ItemFlags Settings1::flags ( const QModelIndex & index ) const
{
	return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
}

То есть любой элемент может быть Selectable и даже Editable. Но Selectable стали только элементы верхнего уровня, а элементы поддеревьев - не Selectable. Но зато Editable работает для всех очень хорошо.

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

Кабздец, нах. Написал альтернативную реализацию модели - всё работает идеально. Предыдущая была жёстко связана с boost::property_tree и по нему в реальном времени копошилась. Где-то чё-то я перехимичил. Буду делать в 2 этапа - сброс содержимого boost::property_tree в своё примитивное тупое дерево, которое будет отдаваться уже модели на съедение. И модель проще, и овцы сыты.

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