Название: Два вопроса по QTreeView. Отправлено: Oleg_IT от Ноябрь 21, 2012, 11:10 1. Есть QTreeView с моделью. У каждого узла дерева есть признак, раскрыт он или свёрнут. При ресете дерева все ветки сворачиваются. Как, по сообщению или в виртуальной функции, сообщить QTreeView, что очередной отображаемый узел должен быть развёрнут.
2. Как изменить шрифт надписи заданного узла? Всё, признаки, шрифт,… хранится в модели. Можно ли «проходя» по модели обратится в соответствующий узел QTreeView? Вижу возможность по номеру строки. Но будет ли он, номер, одинаков при свёрнутом и раскрытом узле выше от текущего узла? Название: Re: Два вопроса по QTreeView. Отправлено: mutineer от Ноябрь 21, 2012, 11:36 1. void QTreeView::expand ( const QModelIndex & index ) [slot]
2. У модели есть роль Qt::FontRole. setData тебе поможет Название: Re: Два вопроса по QTreeView. Отправлено: sergek от Ноябрь 21, 2012, 21:13 Цитировать Можно ли «проходя» по модели обратится в соответствующий узел QTreeView? Вижу возможность по номеру строки. Но будет ли он, номер, одинаков при свёрнутом и раскрытом узле выше от текущего узла? Сама модель не знает, какое представление используется для ее отображения (тем более, что их может быть несколько). Но Вы сами можете связать модель с конкретным представлением. А уж обращаться к узлам представления нужно по индексу, например:Код: index = createIndex(item->childNumber(),0,item); Название: Re: Два вопроса по QTreeView. Отправлено: Oleg_IT от Ноябрь 22, 2012, 08:03 Спасибо за подсказки.
Сама модель не знает, какое представление используется для ее отображения (тем более, что их может быть несколько). Но Вы сами можете связать модель с конкретным представлением. А уж обращаться к узлам представления нужно по индексу, например: … Это я понимаю, поэтому и вопрос возник, как в данном конкретном случае связать модель и представление. Так как я новичок в Qt не все возможности знаю.По совету mutineer обратил внимание на виртуальную функцию data(…), наверное она большинство моих вопросов закроет. Название: Re: Два вопроса по QTreeView. Отправлено: Oleg_IT от Ноябрь 23, 2012, 13:20 По пункту 2 всё понятно, всё работает.
По пункту 1 проблема осталась, проблема с индексом предка, получаю одну и ту же строку. Работаю в структуре модели. Функция createIndex protected, сделал для её вызова функцию обёртку. Какой должен быть третий параметр не понятно, как в примере sergek не получается. Есть виртуальная функция index(…), но опять же третий параметр. Откуда брать QModelIndex? Ставил пустой, не получается. Поделитесь примером программного раскрытия узла из модели. А может можно также как и установка шрифта и других параметров, через data(…)? Название: Re: Два вопроса по QTreeView. Отправлено: mutineer от Ноябрь 23, 2012, 13:33 По пункту 2 всё понятно, всё работает. По пункту 1 проблема осталась, проблема с индексом предка, получаю одну и ту же строку. Работаю в структуре модели. Функция createIndex protected, сделал для её вызова функцию обёртку. Какой должен быть третий параметр не понятно, как в примере sergek не получается. Есть виртуальная функция index(…), но опять же третий параметр. Откуда брать QModelIndex? Ставил пустой, не получается. Поделитесь примером программного раскрытия узла из модели. А может можно также как и установка шрифта и других параметров, через data(…)? Третий параметр - это индекс родительского узла. Для узлов верхнего уровня он пустой, для нижних уровней индекс соответствующего им родителя Название: Re: Два вопроса по QTreeView. Отправлено: Oleg_IT от Ноябрь 23, 2012, 15:05 Что это индекс родителя это понятно. А как его найти (определить)? Или его с рута вести нужно?
Название: Re: Два вопроса по QTreeView. Отправлено: mutineer от Ноябрь 23, 2012, 15:11 Ну ты же знаешь номер строки родительского узла? Вот и создай из него индекс
Название: Re: Два вопроса по QTreeView. Отправлено: Oleg_IT от Ноябрь 23, 2012, 15:16 Я извиняюсь на непонятливость, номер строки это простотой счётчик? И свёрнут узел или развёрнут не важно?
Название: Re: Два вопроса по QTreeView. Отправлено: mutineer от Ноябрь 23, 2012, 15:41 Индекс каждого элемента в модели состоит из номера строки, номера столбца и индекса родительского элемента.
Все элементы первого уровня имеют родителем пустой индекс и строки нумеруются по порядку абсолютно независимо от наличия/количества у них детей, и уж тем более независимо от свернуто/развернуто. Элементы второго уровня имеют родителем элемент первого уровня. Нумерация строк не сквозная и назависима у элементов с разными родителями. Так понятно? Название: Re: Два вопроса по QTreeView. Отправлено: sergek от Ноябрь 23, 2012, 22:15 Цитировать Я извиняюсь на непонятливость, номер строки это простотой счётчик? И свёрнут узел или развёрнут не важно? Да, совершенно верно. Номер строки относится к данным, а не к представлению. Присмотритесь к реализации метода data.Цитировать Поделитесь примером программного раскрытия узла из модели. Прикрепил немного обновленный пример из http://www.prog.org.ru/index.php?topic=8028.msg166102#msg166102 (http://www.prog.org.ru/index.php?topic=8028.msg166102#msg166102). Обновил метод refreshSlot, который должен оставить раскрытым текущий узел при перестроении дерева. Поскольку индексы при обновлении данных теряют актуальность (при сортировке, например), я запоминаю данные текущего узла, потом при пересоздании дерева этот узел отыскиваю (в findItem лучше использовать переопределенный operator==), создаю индекс для него, и делаю его текущим. Он автоматически открывается.Кстати, если в данных, которые использует модель, порядок не меняется, то номер строки в узле можно использовать для позиционирования. Смотрите CScriptCollectionModel::refreshSlot. Открытие узла присходит в mainWindow->getScriptView()->setCurrentIndex(index). Скорее всего, это можно сделать другим способом. Но мне этого было достаточно. Цитировать А может можно также как и установка шрифта и других параметров, через data(…)? Например, иконка узла устанавливается в CScriptCollectionModel::data (для роли Qt::DecorationRole).Название: Re: Два вопроса по QTreeView. Отправлено: Oleg_IT от Ноябрь 27, 2012, 08:16 Спасибо всем, всё получалось.
Я считал, что номер строки это вообще глобальный номер по всему дереву. Ошибался. |