@@ -55,16 +55,19 @@ bool MouseEventHandler::eventFilter(QObject *obj, QEvent *event)
5555 forwardPointEvent (static_cast <QSinglePointEvent *>(event));
5656 return true ;
5757
58- case QEvent::MouseButtonRelease:
58+ case QEvent::MouseButtonRelease: {
5959 emit mouseReleased ();
60+ QQuickItem *oldClickedItem = m_clickedItem;
6061
6162 if (m_clickedItem) {
6263 sendPointEventToItem (static_cast <QSinglePointEvent *>(event), m_clickedItem);
6364 m_clickedItem = nullptr ;
64- } else
65- forwardPointEvent (static_cast <QSinglePointEvent *>(event));
65+ }
66+
67+ forwardPointEvent (static_cast <QSinglePointEvent *>(event), oldClickedItem);
6668
6769 return true ;
70+ }
6871
6972 default :
7073 break ;
@@ -73,7 +76,7 @@ bool MouseEventHandler::eventFilter(QObject *obj, QEvent *event)
7376 return QObject::eventFilter (obj, event);
7477}
7578
76- void MouseEventHandler::forwardPointEvent (QSinglePointEvent *event)
79+ void MouseEventHandler::forwardPointEvent (QSinglePointEvent *event, QQuickItem *oldClickedItem )
7780{
7881 Q_ASSERT (m_spriteRepeater);
7982
@@ -97,22 +100,33 @@ void MouseEventHandler::forwardPointEvent(QSinglePointEvent *event)
97100 // Sort the list by layer order
98101 std::sort (sprites.begin (), sprites.end (), [](IRenderedTarget *t1, IRenderedTarget *t2) { return t1->scratchTarget ()->layerOrder () > t2->scratchTarget ()->layerOrder (); });
99102
100- // Send the event to the hovered sprite
103+ // Find hovered sprite
104+ QQuickItem *hoveredItem = nullptr ;
105+
101106 for (IRenderedTarget *sprite : sprites) {
102107 // contains() expects position in the item's coordinate system
103108 QPointF localPos = sprite->mapFromScene (event->scenePosition ());
104109
105110 if (sprite->contains (localPos)) {
106- sendPointEventToItem (event, sprite) ;
107- return ;
111+ hoveredItem = sprite;
112+ break ;
108113 }
109114 }
110115
111116 // If there wasn't any hovered sprite, send the event to the stage
112- Q_ASSERT (m_stage);
117+ if (!hoveredItem) {
118+ hoveredItem = m_stage;
119+ Q_ASSERT (m_stage);
120+ }
113121
114- if (m_stage)
115- sendPointEventToItem (event, m_stage);
122+ // Send the event to the item
123+ if (hoveredItem) {
124+ // Since both the hovered item and previously clicked item should receive mouse release event,
125+ // avoid duplicate events by checking whether the previously clicked item is the hovered item.
126+ if (!(event->type () == QEvent::MouseButtonRelease && hoveredItem == oldClickedItem)) {
127+ sendPointEventToItem (event, hoveredItem);
128+ }
129+ }
116130}
117131
118132void MouseEventHandler::sendPointEventToItem (QSinglePointEvent *event, QQuickItem *item)
0 commit comments