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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Всплытие айтемов на сцене  (Прочитано 5260 раз)
Гурман
Гуру общения
******
Offline 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 Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #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 Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Июль 15, 2015, 16:25 »

А почему так сложно? Не проще найти максимальный индекс по всем айтемам и сделать плюс 1?

по сути, это будет почти один в один тоже самое, что setZValue( scene->items().first()->zValue() + 1 ) только своими руками

Записан

2^7-1 == 127, задумайтесь...
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Июль 16, 2015, 10:35 »

как вариант рисовать итем в функци QGraphicsScene::drawForeground. Тогда он точно будет повер хвсех остальных, даже не меняя его z. Но придется извратиться немного.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Июль 16, 2015, 21:32 »

как вариант рисовать итем в функци QGraphicsScene::drawForeground. Тогда он точно будет повер хвсех остальных, даже не меняя его z. Но придется извратиться немного.

У меня экземпляров таких айтемов на сцене может лежать несколько тысяч, а всплывать должен тот из них, на который мышиным курсором наехали, но и не только - при этом надо поднимать все такие же айтемы, с которыми он связан. На самом деле, эти айтемы - отрезки (вертикальные или горизонтальные части) ортогональных соединителей (ну типа проводов) некой схемы. При наведении курсора на любой отрезок соединителя, все отрезки, которые входят в этот соединитель, должны всплыть. При этом под ними могут быть отрезки других соединителей, которые входят в "шину" вместе с всплывающим. А если курсор переместился на отрезок другого соединителя из этой же шины, всплыть должны его отрезки, уже поверх тех, которые перед этим были над ними. То есть, если сделать через QGraphicsScene::drawForeground, получится небольшой такой локальный дурдом.
« Последнее редактирование: Июль 16, 2015, 21:35 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Июль 17, 2015, 10:19 »

тогда нужно подумать над реализацей "слоев"... и рисовать по слоям... по факту под слоем можно понимать просто группу элементов.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Июль 17, 2015, 12:46 »

Не факт, что накладные расходы при этом не будут больше, чем просто поиск верхнего айтема.
Записан

2^7-1 == 127, задумайтесь...
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #7 : Июль 17, 2015, 14:10 »

не факт, но как говорится пока не поробуешь - не узнаешь  Веселый
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Июль 18, 2015, 00:04 »

К сожалению, у меня уже нет времени на эксперименты
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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