Russian Qt Forum
Ноябрь 22, 2024, 18:39
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Всплытие айтемов на сцене
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Всплытие айтемов на сцене (Прочитано 5613 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Всплытие айтемов на сцене
«
:
Июль 08, 2015, 21:09 »
Нужно сделать, чтобы некий графический айтем всплывал на сцене наверх, и рисовался выше перекрывающих его. Когда-то делал, и вроде работало. Сейчас фишка в том, что все айтемы, на самом деле - отрезки, наследники класса QGraphicsLineItem. По старой памяти сделал аналогично:
- по списку collidingItems() для this айтема (в куДебаге вижу что получаю список правильно)
-- если zValue пересекающегося айтема больше, чем zValue у this
--- обменять местами zValue пересекающегося айтема и this
--- update пересекающегося айтема
-- если zValue пересекающегося айтема такое же, как у this
--- установить this айтему zValue равным zValue пересекающегося +1
-- update this айтема и на всякий случай update всей сцены
Не работает. В куДебаге вижу, что после выполнения у this айтема zValue всегда больше, чем у перекрывающих, но визуально он остаётся ниже (this отрезок отображается в 3 раза более широкой линией другого цвета, поэтому виден, даже если полностью под другим). Что не так в идее или чего не хватает? Может какие-то тонкости у QGraphicsLineItem?
Со stackBefore тоже игрался - без результата.
ЗЫ: Если кто будет предлагать сделать просто setZValue( scene->items().first()->zValue() + 1 ), да так работает. Топорно. Сейчас на сцене у меня несколько сотен айтемов, и это очень простая сцена. Я посмотрел код items()... В реальности на сцене может быть сотня тысяч айтемов и больше - есть мнение, что тогда наступят большие тормоза.
«
Последнее редактирование: Июль 08, 2015, 22:50 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Всплытие айтемов на сцене
«
Ответ #1 :
Июль 15, 2015, 15:32 »
А почему так сложно? Не проще найти максимальный индекс по всем айтемам и сделать плюс 1?
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Всплытие айтемов на сцене
«
Ответ #2 :
Июль 15, 2015, 16:25 »
Цитата: Racheengel от Июль 15, 2015, 15:32
А почему так сложно? Не проще найти максимальный индекс по всем айтемам и сделать плюс 1?
по сути, это будет почти один в один тоже самое, что setZValue( scene->items().first()->zValue() + 1 ) только своими руками
Записан
2^7-1 == 127, задумайтесь...
Fregloin
Супер
Offline
Сообщений: 1025
Re: Всплытие айтемов на сцене
«
Ответ #3 :
Июль 16, 2015, 10:35 »
как вариант рисовать итем в функци QGraphicsScene::drawForeground. Тогда он точно будет повер хвсех остальных, даже не меняя его z. Но придется извратиться немного.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Всплытие айтемов на сцене
«
Ответ #4 :
Июль 16, 2015, 21:32 »
Цитата: Fregloin от Июль 16, 2015, 10:35
как вариант рисовать итем в функци QGraphicsScene::drawForeground. Тогда он точно будет повер хвсех остальных, даже не меняя его z. Но придется извратиться немного.
У меня экземпляров таких айтемов на сцене может лежать несколько тысяч, а всплывать должен тот из них, на который мышиным курсором наехали, но и не только - при этом надо поднимать все такие же айтемы, с которыми он связан. На самом деле, эти айтемы - отрезки (вертикальные или горизонтальные части) ортогональных соединителей (ну типа проводов) некой схемы. При наведении курсора на любой отрезок соединителя, все отрезки, которые входят в этот соединитель, должны всплыть. При этом под ними могут быть отрезки других соединителей, которые входят в "шину" вместе с всплывающим. А если курсор переместился на отрезок другого соединителя из этой же шины, всплыть должны его отрезки, уже поверх тех, которые перед этим были над ними. То есть, если сделать через QGraphicsScene::drawForeground, получится небольшой такой локальный дурдом.
«
Последнее редактирование: Июль 16, 2015, 21:35 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Fregloin
Супер
Offline
Сообщений: 1025
Re: Всплытие айтемов на сцене
«
Ответ #5 :
Июль 17, 2015, 10:19 »
тогда нужно подумать над реализацей "слоев"... и рисовать по слоям... по факту под слоем можно понимать просто группу элементов.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Всплытие айтемов на сцене
«
Ответ #6 :
Июль 17, 2015, 12:46 »
Не факт, что накладные расходы при этом не будут больше, чем просто поиск верхнего айтема.
Записан
2^7-1 == 127, задумайтесь...
Fregloin
Супер
Offline
Сообщений: 1025
Re: Всплытие айтемов на сцене
«
Ответ #7 :
Июль 17, 2015, 14:10 »
не факт, но как говорится пока не поробуешь - не узнаешь
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Всплытие айтемов на сцене
«
Ответ #8 :
Июль 18, 2015, 00:04 »
К сожалению, у меня уже нет времени на эксперименты
Записан
2^7-1 == 127, задумайтесь...
Страниц: [
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...