Add helper function to reset QMouseEvent localPos

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 <shawn.rutledge@qt.io>
This commit is contained in:
Frederik Gladhorn 2016-07-29 13:34:29 +02:00 committed by Shawn Rutledge
parent f2995ee078
commit 6f75096afc
3 changed files with 35 additions and 0 deletions

View File

@ -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

View File

@ -132,6 +132,8 @@ public:
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

View File

@ -75,6 +75,7 @@ public slots:
void cleanupTestCase();
void init();
private slots:
void mouseEventBasic();
void checkMousePressEvent_data();
void checkMousePressEvent();
void checkMouseReleaseEvent_data();
@ -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");