Russian Qt Forum
Ноябрь 27, 2024, 22:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeView и вставка пустых детей родителям  (Прочитано 7332 раз)
patison
Гость
« : Сентябрь 16, 2010, 15:57 »

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

Спасибо.
Записан
EhTemka
Гость
« Ответ #1 : Сентябрь 16, 2010, 16:10 »

Можно переопределить функцию bool hasChildren(const QModelIndex &parent) const у модели и в ней реализовать проверку, что-то типа данных не запрошены значит true, данные запрошены, но их нет - значит false
Записан
Denjs
Гость
« Ответ #2 : Сентябрь 16, 2010, 16:13 »

Я конечно не по теме, но вам не кажется, что лучше информировать пользователя что у объекта нет дочерних объектов путем "отсутствия плюсика" ещё до того как он попытается открыть элемент?

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

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

Записан
patison
Гость
« Ответ #3 : Сентябрь 16, 2010, 16:52 »

Denjs:
Ну дело в том,  что загружаются все элементы по мере надобности. Т.е. только тогда, когда юзер раскрывает родителя. На момент загрузки первоначальных айтемов (из какого-то условново корня), я не могу знать для каждого из загруженных элементов - есть у него дети или нет, а даже если и смогу как-то это узнать - мне надо каким-то образом ему подставить этот крестик.
На данный момент плюсики появляются только у тех элементов, в которые по факту были подгружены дети.
Записан
Kolobok
Гость
« Ответ #4 : Сентябрь 16, 2010, 17:12 »

а даже если и смогу как-то это узнать - мне надо каким-то образом ему подставить этот крестик.

Для этого тебе и посоветовали переопределить функцию bool hasChildren(const QModelIndex &parent) const у модели. Если функция возвращает true то view нарисует крестик для этого индекса.
Записан
patison
Гость
« Ответ #5 : Сентябрь 16, 2010, 17:20 »

Уже пошёл пробовать Улыбающийся
Записан
EhTemka
Гость
« Ответ #6 : Сентябрь 16, 2010, 17:29 »

Про проверку на парент не забудь, если парент невалидный нужно всегда возвращать true
Записан
patison
Гость
« Ответ #7 : Сентябрь 16, 2010, 19:52 »

Ну впринципе работает.
Но хотелось-бы как-то не для всех сразу возвращать true, а для каких-то конкретных. Через parent проверить не получится, т.к. он содержит только данные в виде текста (текст самого элемента в дереве). Было-бы идеально, если-бы при занесении элемента в модель - можно было явно для каждого элемента указывать.
Записан
EhTemka
Гость
« Ответ #8 : Сентябрь 16, 2010, 19:57 »

парент содержит еще номер строки и свой парент. Ответ на твой вопрос содержится в ответе на вопрос как ты связываешь свои данные с индексами в модели.
Записан
patison
Гость
« Ответ #9 : Сентябрь 16, 2010, 20:20 »

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

Цитировать
Данными просто заполняется модель

А что за модель? Стандартная или своя?
Записан
patison
Гость
« Ответ #11 : Сентябрь 16, 2010, 21:07 »

Своя. Делал по аналогии с Simple Tree Model example (http://doc.trolltech.com/4.6/itemviews-simpletreemodel.html)
Записан
EhTemka
Гость
« Ответ #12 : Сентябрь 16, 2010, 21:15 »

Ну и в чем проблема. Вот связь индекса с данными parentItem = static_cast<TreeItem*>(parent.internalPointer());

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

Записан
patison
Гость
« Ответ #13 : Сентябрь 16, 2010, 23:52 »

То что нужно! По вашему совету создал флаг в TreeItem, который проверяю в hasChildren(), и в зависимости от него возвращаю true или false. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.059 секунд. Запросов: 21.