Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Oleg_IT от Ноябрь 21, 2012, 11:10



Название: Два вопроса по 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);
    mainWindow->treeView->setCurrentIndex(index);
Кстати, setCurrentIndex() делает нужный узел видимым, т.е. разворачивает дерево, если этот узел скрыт (это к п.1).


Название: 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
Спасибо всем, всё получалось.
Я считал, что номер строки это вообще глобальный номер по всему дереву. Ошибался.