Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Гурман от Июль 08, 2015, 21:09



Название: Всплытие айтемов на сцене
Отправлено: Гурман от Июль 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
К сожалению, у меня уже нет времени на эксперименты