QGraphicsItem под курсором при выходе из объекта, а над другим элементом - PullRequest
0 голосов
/ 10 июля 2019

У меня есть QGraphicsScene, QGraphicsView и некоторые подклассы QGraphicsItems.Я хочу отследить, какой элемент находится под курсором, видимым сверху.Он работает нормально, используя hoverEnterEvent в большинстве ситуаций, но если у меня есть два объекта, где один находится над другим, он работает при вводе обоих, но не при выходе из внутреннего объекта (и повторного входа во внешний, так как он никогда не оставлял внешний впервое место).

           +-------------------------------------+
  outside  |                                     |
           |  outer                              |
           |                                     |
           |                                     |
           |           +-------------+           |     +-------------+ 
           |           |             |           |     |             | 
           |           |             |           |     |   another   |
           |           |    inner    |           |     |             |
           |           |             |           |     |             |
           |           |             |           |     +-------------+ 
           |           +-------------+           |
           |                                     |
           |                                     |
           |                                     |
           |                                     |
           +-------------------------------------+

outside -> outer : works, outer is selected
outside -> outer -> outside -> another : works, first outside is selected, than nothing, than another
outer -> inner : works, inner is seletected
outside -> outer -> inner -> outer: does not work, first outside is selected, than inner, but than nothing (should be outer again)

Что я могу сделать, кроме циклического перебора всех графических элементов, запускаемых с помощью небольшого отложенного одиночного снимка на hoverLeaveEvent?

Редактировать: я нашел временное решение: я добавилglobal QList , где в MyQGraphicsItem :: hoverEnterEvent я добавляю «this», а в MyGraphicsItem :: hoverLeaveEvent я удаляю последний элемент в списке.Таким образом, myGlobalQList.last () всегда содержит самый верхний элемент, видимый под курсором.Я предполагаю, что это не лучшее решение, поскольку QList не является поточно-ориентированным, поэтому я все еще заинтересован в других решениях.

1 Ответ

0 голосов
/ 10 июля 2019

Ваши QGraphicsItem s живут в QGraphicsScene, который может отображаться одним или несколькими QGraphicsView s.

Я знаю, что отображение вида модели обычно составляет 1: 1.

Тем не менее, я предлагаю реализовать манипулирование мышью следующим образом:

Установите eventFilter на graphicsView->viewport().

Переопределить функцию eventFilter() в вашем классе фильтров.

Наблюдайте за QEvent::MousePress, MouseMove, MouseRelease, возможно Enter и Leave, в зависимости от того, что вам нужно.

Возможно, вам нужно setMouseTracking(true) в окне просмотра.

Затем в функции фильтра событий используйте QGraphicsView::mapToScene() и QGraphicsScene::itemAt(), чтобы найти самый верхний элемент, или ::items(), чтобы найти все элементы под курсором.

Недавно я использовал это, чтобы украсить верхний элемент с рамкой, закрасив вид (QGraphicsView::drawForeground()).

...