Skip to content

Commit

Permalink
Add helper function to reset QMouseEvent localPos
Browse files Browse the repository at this point in the history
In Qt Quick there are many places which copy mouse events repeatedly,
with the only goal of adjusting the local position. Instead it's much
more sensible to re-use the same event.

Change-Id: I2c6f2b73ee3a7a6df489f813cf2f60b48a6e48df
Reviewed-by: Shawn Rutledge <[email protected]>
  • Loading branch information
gladhorn authored and ec1oud committed Aug 1, 2016
1 parent f2995ee commit 6f75096
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/gui/kernel/qevent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,18 @@ Qt::MouseEventFlags QMouseEvent::flags() const
\sa x(), y(), windowPos(), screenPos()
*/

/*!
\fn void QMouseEvent::setLocalPos(const QPointF &localPosition)
\since 5.8
\internal
Sets the local position in the mouse event to \a localPosition. This allows to re-use one event
when sending it to a series of receivers that expect the local pos in their
respective local coordinates.
*/

/*!
\fn QPointF QMouseEvent::windowPos() const
Expand Down
2 changes: 2 additions & 0 deletions src/gui/kernel/qevent.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ class Q_GUI_EXPORT QMouseEvent : public QInputEvent
inline Qt::MouseButton button() const { return b; }
inline Qt::MouseButtons buttons() const { return mouseState; }

inline void setLocalPos(const QPointF &localPosition) { l = localPosition; }

#if QT_DEPRECATED_SINCE(5, 0)
QT_DEPRECATED inline QPointF posF() const { return l; }
#endif
Expand Down
21 changes: 21 additions & 0 deletions tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public slots:
void cleanupTestCase();
void init();
private slots:
void mouseEventBasic();
void checkMousePressEvent_data();
void checkMousePressEvent();
void checkMouseReleaseEvent_data();
Expand Down Expand Up @@ -107,6 +108,26 @@ void tst_QMouseEvent::init()
testMouseWidget->mouseReleaseModifiers = 0;
}

void tst_QMouseEvent::mouseEventBasic()
{
QPointF local(100, 100);
QPointF scene(200, 200);
QPointF screen(300, 300);
QMouseEvent me(QEvent::MouseButtonPress, local, scene, screen, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QCOMPARE(me.isAccepted(), true);
QCOMPARE(me.button(), Qt::LeftButton);
QCOMPARE(me.buttons(), Qt::LeftButton);
QCOMPARE(me.localPos(), local);
QCOMPARE(me.windowPos(), scene);
QCOMPARE(me.screenPos(), screen);

QPointF changedLocal(33, 66);
me.setLocalPos(changedLocal);
QCOMPARE(me.localPos(), changedLocal);
QCOMPARE(me.windowPos(), scene);
QCOMPARE(me.screenPos(), screen);
}

void tst_QMouseEvent::checkMousePressEvent_data()
{
QTest::addColumn<int>("buttonPressed");
Expand Down

0 comments on commit 6f75096

Please sign in to comment.