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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Два вопроса по QTreeView.  (Прочитано 10382 раз)
Oleg_IT
Гость
« : Ноябрь 21, 2012, 11:10 »

1. Есть QTreeView с моделью. У каждого узла дерева есть признак, раскрыт он или свёрнут. При ресете дерева все ветки сворачиваются. Как, по сообщению или в виртуальной функции, сообщить QTreeView, что очередной отображаемый узел должен быть развёрнут.
2. Как изменить шрифт надписи заданного узла?
Всё, признаки, шрифт,… хранится в модели. Можно ли «проходя» по модели обратится в соответствующий узел QTreeView? Вижу возможность по номеру строки. Но будет ли он, номер, одинаков при свёрнутом и раскрытом узле выше от текущего узла?
Записан
mutineer
Гость
« Ответ #1 : Ноябрь 21, 2012, 11:36 »

1. void QTreeView::expand ( const QModelIndex & index ) [slot]
2. У модели есть роль Qt::FontRole. setData тебе поможет
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Ноябрь 21, 2012, 21:13 »

Цитировать
Можно ли «проходя» по модели обратится в соответствующий узел QTreeView? Вижу возможность по номеру строки. Но будет ли он, номер, одинаков при свёрнутом и раскрытом узле выше от текущего узла?
Сама модель не знает, какое представление используется для ее отображения (тем более, что их может быть несколько). Но Вы сами можете связать модель с конкретным представлением. А уж обращаться к узлам представления нужно по индексу, например:
Код:
    index = createIndex(item->childNumber(),0,item);
    mainWindow->treeView->setCurrentIndex(index);
Кстати, setCurrentIndex() делает нужный узел видимым, т.е. разворачивает дерево, если этот узел скрыт (это к п.1).
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Oleg_IT
Гость
« Ответ #3 : Ноябрь 22, 2012, 08:03 »

Спасибо за подсказки.
Сама модель не знает, какое представление используется для ее отображения (тем более, что их может быть несколько). Но Вы сами можете связать модель с конкретным представлением. А уж обращаться к узлам представления нужно по индексу, например: …
Это я понимаю, поэтому и вопрос возник, как в данном конкретном случае связать модель и представление. Так как я новичок в Qt не все возможности знаю.
По совету mutineer обратил внимание на виртуальную функцию data(…), наверное она большинство моих вопросов закроет.
Записан
Oleg_IT
Гость
« Ответ #4 : Ноябрь 23, 2012, 13:20 »

По пункту 2 всё понятно, всё работает.
По пункту 1 проблема осталась, проблема с индексом предка, получаю одну и ту же строку.
Работаю в структуре модели. Функция createIndex protected, сделал для её вызова функцию обёртку. Какой должен быть третий параметр не понятно, как в примере sergek не получается. Есть виртуальная функция index(…), но опять же третий параметр. Откуда брать QModelIndex? Ставил пустой, не получается.
Поделитесь примером программного раскрытия узла из модели. А может можно также как и установка шрифта и других параметров, через data(…)?
Записан
mutineer
Гость
« Ответ #5 : Ноябрь 23, 2012, 13:33 »

По пункту 2 всё понятно, всё работает.
По пункту 1 проблема осталась, проблема с индексом предка, получаю одну и ту же строку.
Работаю в структуре модели. Функция createIndex protected, сделал для её вызова функцию обёртку. Какой должен быть третий параметр не понятно, как в примере sergek не получается. Есть виртуальная функция index(…), но опять же третий параметр. Откуда брать QModelIndex? Ставил пустой, не получается.
Поделитесь примером программного раскрытия узла из модели. А может можно также как и установка шрифта и других параметров, через data(…)?


Третий параметр - это индекс родительского узла. Для узлов верхнего уровня он пустой, для нижних уровней индекс соответствующего им родителя
Записан
Oleg_IT
Гость
« Ответ #6 : Ноябрь 23, 2012, 15:05 »

Что это индекс родителя это понятно. А как его найти (определить)? Или его с рута вести нужно?
Записан
mutineer
Гость
« Ответ #7 : Ноябрь 23, 2012, 15:11 »

Ну ты же знаешь номер строки родительского узла? Вот и создай из него индекс
Записан
Oleg_IT
Гость
« Ответ #8 : Ноябрь 23, 2012, 15:16 »

Я извиняюсь на непонятливость, номер строки это простотой счётчик? И свёрнут узел или развёрнут не важно?
Записан
mutineer
Гость
« Ответ #9 : Ноябрь 23, 2012, 15:41 »

Индекс каждого элемента в модели состоит из номера строки, номера столбца и индекса родительского элемента.
Все элементы первого уровня имеют родителем пустой индекс и строки нумеруются по порядку абсолютно независимо от наличия/количества у них детей, и уж тем более независимо от свернуто/развернуто.
Элементы второго уровня имеют родителем элемент первого уровня. Нумерация строк не сквозная и назависима у элементов с разными родителями.
Так понятно?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #10 : Ноябрь 23, 2012, 22:15 »

Цитировать
Я извиняюсь на непонятливость, номер строки это простотой счётчик? И свёрнут узел или развёрнут не важно?
Да, совершенно верно. Номер строки относится к данным, а не к представлению. Присмотритесь к реализации метода data.
Цитировать
Поделитесь примером программного раскрытия узла из модели.
Прикрепил немного обновленный пример из 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).
« Последнее редактирование: Ноябрь 23, 2012, 22:22 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Oleg_IT
Гость
« Ответ #11 : Ноябрь 27, 2012, 08:16 »

Спасибо всем, всё получалось.
Я считал, что номер строки это вообще глобальный номер по всему дереву. Ошибался.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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