Russian Qt Forum

Qt => Model-View (MV) => Тема начата: patison от Сентябрь 16, 2010, 15:57



Название: QTreeView и вставка пустых детей родителям
Отправлено: patison от Сентябрь 16, 2010, 15:57
Имеется treeview, а также имеется модель для заполнения данными этого treeview.
вопрос состоит в следующем - есть-ли возможность задавать некоторым узлам (родителям) пустых детей, таким образом, что-бы у каждого из этих родителей добавлялся значок развёртки (+), и при нажатии на который, в случае если дети пусты, просто появлялся значок свёртки (-).
Попытался решить вопрос путём добавления родителю пустого контейнера в качестве ребёнка (пустой QList), однако при развёртывании этого родительского узла - показывается один пустой элемент (а хотелось-бы сделать аналогично модели QFileSystemModel, в которой это дело реализовано для пустых папок).

Спасибо.


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: EhTemka от Сентябрь 16, 2010, 16:10
Можно переопределить функцию bool hasChildren(const QModelIndex &parent) const у модели и в ней реализовать проверку, что-то типа данных не запрошены значит true, данные запрошены, но их нет - значит false


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: Denjs от Сентябрь 16, 2010, 16:13
Я конечно не по теме, но вам не кажется, что лучше информировать пользователя что у объекта нет дочерних объектов путем "отсутствия плюсика" ещё до того как он попытается открыть элемент?

а если вам надоинформировать что этот элемент - скажем каталог, а не файл и может содержать дочерние объекты в принципе - используйте для этого соответсвующие иконки.

зачем вам понадобилось так делать как вы описываете?



Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: patison от Сентябрь 16, 2010, 16:52
Denjs:
Ну дело в том,  что загружаются все элементы по мере надобности. Т.е. только тогда, когда юзер раскрывает родителя. На момент загрузки первоначальных айтемов (из какого-то условново корня), я не могу знать для каждого из загруженных элементов - есть у него дети или нет, а даже если и смогу как-то это узнать - мне надо каким-то образом ему подставить этот крестик.
На данный момент плюсики появляются только у тех элементов, в которые по факту были подгружены дети.


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: Kolobok от Сентябрь 16, 2010, 17:12
а даже если и смогу как-то это узнать - мне надо каким-то образом ему подставить этот крестик.

Для этого тебе и посоветовали переопределить функцию bool hasChildren(const QModelIndex &parent) const у модели. Если функция возвращает true то view нарисует крестик для этого индекса.


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: patison от Сентябрь 16, 2010, 17:20
Уже пошёл пробовать :)


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: EhTemka от Сентябрь 16, 2010, 17:29
Про проверку на парент не забудь, если парент невалидный нужно всегда возвращать true


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: patison от Сентябрь 16, 2010, 19:52
Ну впринципе работает.
Но хотелось-бы как-то не для всех сразу возвращать true, а для каких-то конкретных. Через parent проверить не получится, т.к. он содержит только данные в виде текста (текст самого элемента в дереве). Было-бы идеально, если-бы при занесении элемента в модель - можно было явно для каждого элемента указывать.


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: EhTemka от Сентябрь 16, 2010, 19:57
парент содержит еще номер строки и свой парент. Ответ на твой вопрос содержится в ответе на вопрос как ты связываешь свои данные с индексами в модели.


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: patison от Сентябрь 16, 2010, 20:20
Хм.. Вот над этим я не задумывался. Данными просто заполняется модель. Данные - будь то листинг файлов и директорий, будь какая-нибудь коллекция данных, полученная из БД. Т.е. есть цикл перебора этих данных, на каждой итерации цикла в QList забиваются все столбцы по конкретному элементу, и производится присоединение элемента к списку: parents.last()->appendChild(fItem);


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: EhTemka от Сентябрь 16, 2010, 20:26
Цитировать
Данными просто заполняется модель

А что за модель? Стандартная или своя?


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: patison от Сентябрь 16, 2010, 21:07
Своя. Делал по аналогии с Simple Tree Model example (http://doc.trolltech.com/4.6/itemviews-simpletreemodel.html)


Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: EhTemka от Сентябрь 16, 2010, 21:15
Ну и в чем проблема. Вот связь индекса с данными parentItem = static_cast<TreeItem*>(parent.internalPointer());

в TreeItem можно добавить флаг, были ли запрошены данные для детей или нет, и по нему делать проверку в функции hasChildren.



Название: Re: QTreeView и вставка пустых детей родителям
Отправлено: patison от Сентябрь 16, 2010, 23:52
То что нужно! По вашему совету создал флаг в TreeItem, который проверяю в hasChildren(), и в зависимости от него возвращаю true или false. Спасибо.