Russian Qt Forum
Ноябрь 24, 2024, 12:28
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Два вопроса по QTreeView.
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Два вопроса по QTreeView. (Прочитано 10700 раз)
Oleg_IT
Гость
Два вопроса по QTreeView.
«
:
Ноябрь 21, 2012, 11:10 »
1. Есть QTreeView с моделью. У каждого узла дерева есть признак, раскрыт он или свёрнут. При ресете дерева все ветки сворачиваются. Как, по сообщению или в виртуальной функции, сообщить QTreeView, что очередной отображаемый узел должен быть развёрнут.
2. Как изменить шрифт надписи заданного узла?
Всё, признаки, шрифт,… хранится в модели. Можно ли «проходя» по модели обратится в соответствующий узел QTreeView? Вижу возможность по номеру строки. Но будет ли он, номер, одинаков при свёрнутом и раскрытом узле выше от текущего узла?
Записан
mutineer
Гость
Re: Два вопроса по QTreeView.
«
Ответ #1 :
Ноябрь 21, 2012, 11:36 »
1. void QTreeView::expand ( const QModelIndex & index ) [slot]
2. У модели есть роль Qt::FontRole. setData тебе поможет
Записан
sergek
Гипер активный житель
Offline
Сообщений: 872
Мы должны приносить пользу людям.
Re: Два вопроса по QTreeView.
«
Ответ #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
Гость
Re: Два вопроса по QTreeView.
«
Ответ #3 :
Ноябрь 22, 2012, 08:03 »
Спасибо за подсказки.
Цитата: sergek от Ноябрь 21, 2012, 21:13
Сама модель не знает, какое представление используется для ее отображения (тем более, что их может быть несколько). Но Вы сами можете связать модель с конкретным представлением. А уж обращаться к узлам представления нужно по индексу, например: …
Это я понимаю, поэтому и вопрос возник, как в данном конкретном случае связать модель и представление. Так как я новичок в Qt не все возможности знаю.
По совету mutineer обратил внимание на виртуальную функцию data(…), наверное она большинство моих вопросов закроет.
Записан
Oleg_IT
Гость
Re: Два вопроса по QTreeView.
«
Ответ #4 :
Ноябрь 23, 2012, 13:20 »
По пункту 2 всё понятно, всё работает.
По пункту 1 проблема осталась, проблема с индексом предка, получаю одну и ту же строку.
Работаю в структуре модели. Функция createIndex protected, сделал для её вызова функцию обёртку. Какой должен быть третий параметр не понятно, как в примере sergek не получается. Есть виртуальная функция index(…), но опять же третий параметр. Откуда брать QModelIndex? Ставил пустой, не получается.
Поделитесь примером программного раскрытия узла из модели. А может можно также как и установка шрифта и других параметров, через data(…)?
Записан
mutineer
Гость
Re: Два вопроса по QTreeView.
«
Ответ #5 :
Ноябрь 23, 2012, 13:33 »
Цитата: Oleg_IT от Ноябрь 23, 2012, 13:20
По пункту 2 всё понятно, всё работает.
По пункту 1 проблема осталась, проблема с индексом предка, получаю одну и ту же строку.
Работаю в структуре модели. Функция createIndex protected, сделал для её вызова функцию обёртку. Какой должен быть третий параметр не понятно, как в примере sergek не получается. Есть виртуальная функция index(…), но опять же третий параметр. Откуда брать QModelIndex? Ставил пустой, не получается.
Поделитесь примером программного раскрытия узла из модели. А может можно также как и установка шрифта и других параметров, через data(…)?
Третий параметр - это индекс родительского узла. Для узлов верхнего уровня он пустой, для нижних уровней индекс соответствующего им родителя
Записан
Oleg_IT
Гость
Re: Два вопроса по QTreeView.
«
Ответ #6 :
Ноябрь 23, 2012, 15:05 »
Что это индекс родителя это понятно. А как его найти (определить)? Или его с рута вести нужно?
Записан
mutineer
Гость
Re: Два вопроса по QTreeView.
«
Ответ #7 :
Ноябрь 23, 2012, 15:11 »
Ну ты же знаешь номер строки родительского узла? Вот и создай из него индекс
Записан
Oleg_IT
Гость
Re: Два вопроса по QTreeView.
«
Ответ #8 :
Ноябрь 23, 2012, 15:16 »
Я извиняюсь на непонятливость, номер строки это простотой счётчик? И свёрнут узел или развёрнут не важно?
Записан
mutineer
Гость
Re: Два вопроса по QTreeView.
«
Ответ #9 :
Ноябрь 23, 2012, 15:41 »
Индекс каждого элемента в модели состоит из номера строки, номера столбца и индекса родительского элемента.
Все элементы первого уровня имеют родителем пустой индекс и строки нумеруются по порядку абсолютно независимо от наличия/количества у них детей, и уж тем более независимо от свернуто/развернуто.
Элементы второго уровня имеют родителем элемент первого уровня. Нумерация строк не сквозная и назависима у элементов с разными родителями.
Так понятно?
Записан
sergek
Гипер активный житель
Offline
Сообщений: 872
Мы должны приносить пользу людям.
Re: Два вопроса по QTreeView.
«
Ответ #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
Гость
Re: Два вопроса по QTreeView.
«
Ответ #11 :
Ноябрь 27, 2012, 08:16 »
Спасибо всем, всё получалось.
Я считал, что номер строки это вообще глобальный номер по всему дереву. Ошибался.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...