Название: 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. Спасибо.
|