Название: Всплытие айтемов на сцене Отправлено: Гурман от Июль 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()... В реальности на сцене может быть сотня тысяч айтемов и больше - есть мнение, что тогда наступят большие тормоза. Название: Re: Всплытие айтемов на сцене Отправлено: Racheengel от Июль 15, 2015, 15:32 А почему так сложно? Не проще найти максимальный индекс по всем айтемам и сделать плюс 1?
Название: Re: Всплытие айтемов на сцене Отправлено: Гурман от Июль 15, 2015, 16:25 А почему так сложно? Не проще найти максимальный индекс по всем айтемам и сделать плюс 1? по сути, это будет почти один в один тоже самое, что setZValue( scene->items().first()->zValue() + 1 ) только своими руками Название: Re: Всплытие айтемов на сцене Отправлено: Fregloin от Июль 16, 2015, 10:35 как вариант рисовать итем в функци QGraphicsScene::drawForeground. Тогда он точно будет повер хвсех остальных, даже не меняя его z. Но придется извратиться немного.
Название: Re: Всплытие айтемов на сцене Отправлено: Гурман от Июль 16, 2015, 21:32 как вариант рисовать итем в функци QGraphicsScene::drawForeground. Тогда он точно будет повер хвсех остальных, даже не меняя его z. Но придется извратиться немного. У меня экземпляров таких айтемов на сцене может лежать несколько тысяч, а всплывать должен тот из них, на который мышиным курсором наехали, но и не только - при этом надо поднимать все такие же айтемы, с которыми он связан. На самом деле, эти айтемы - отрезки (вертикальные или горизонтальные части) ортогональных соединителей (ну типа проводов) некой схемы. При наведении курсора на любой отрезок соединителя, все отрезки, которые входят в этот соединитель, должны всплыть. При этом под ними могут быть отрезки других соединителей, которые входят в "шину" вместе с всплывающим. А если курсор переместился на отрезок другого соединителя из этой же шины, всплыть должны его отрезки, уже поверх тех, которые перед этим были над ними. То есть, если сделать через QGraphicsScene::drawForeground, получится небольшой такой локальный дурдом. Название: Re: Всплытие айтемов на сцене Отправлено: Fregloin от Июль 17, 2015, 10:19 тогда нужно подумать над реализацей "слоев"... и рисовать по слоям... по факту под слоем можно понимать просто группу элементов.
Название: Re: Всплытие айтемов на сцене Отправлено: Гурман от Июль 17, 2015, 12:46 Не факт, что накладные расходы при этом не будут больше, чем просто поиск верхнего айтема.
Название: Re: Всплытие айтемов на сцене Отправлено: Fregloin от Июль 17, 2015, 14:10 не факт, но как говорится пока не поробуешь - не узнаешь :D
Название: Re: Всплытие айтемов на сцене Отправлено: Гурман от Июль 18, 2015, 00:04 К сожалению, у меня уже нет времени на эксперименты
|