From f04011afa242f3c63b6670143a38093dc8d40a46 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Wed, 19 Feb 2014 13:56:41 +0100 Subject: Add touch and wheel events to QQuickWidget Change-Id: Idb444cbc62491469230c5a1f624d71cf20bce492 Reviewed-by: Paul Olav Tvete --- src/quickwidgets/qquickwidget.cpp | 31 ++++++++++++++++++++++++++++++- src/quickwidgets/qquickwidget.h | 4 ++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 840877d72e..7458d2de01 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -746,6 +746,10 @@ void QQuickWidget::mouseMoveEvent(QMouseEvent *e) Q_D(QQuickWidget); Q_QUICK_PROFILE(addEvent()); + // Use the constructor taking localPos and screenPos. That puts localPos into the + // event's localPos and windowPos, and screenPos into the event's screenPos. This way + // the windowPos in e is ignored and is replaced by localPos. This is necessary + // because QQuickWindow thinks of itself as a top-level window always. QMouseEvent mappedEvent(e->type(), e->localPos(), e->screenPos(), e->button(), e->buttons(), e->modifiers()); d->offscreenWindow->mouseMoveEvent(&mappedEvent); } @@ -784,18 +788,43 @@ void QQuickWidget::mouseReleaseEvent(QMouseEvent *e) d->offscreenWindow->mouseReleaseEvent(&mappedEvent); } +#ifndef QT_NO_WHEELEVENT +/*! \reimp */ +void QQuickWidget::wheelEvent(QWheelEvent *e) +{ + Q_D(QQuickWidget); + Q_QUICK_PROFILE(addEvent()); + + // Wheel events only have local and global positions, no need to map. + d->offscreenWindow->wheelEvent(e); +} +#endif + /*! \reimp */ bool QQuickWidget::event(QEvent *e) { Q_D(QQuickWidget); - if (e->type() == QEvent::Timer) { + + switch (e->type()) { + case QEvent::Timer: d->eventPending = false; killTimer(d->updateTimer); d->updateTimer = 0; if (d->updatePending) d->renderSceneGraph(); return true; + + case QEvent::TouchBegin: + case QEvent::TouchEnd: + case QEvent::TouchUpdate: + case QEvent::TouchCancel: + // Touch events only have local and global positions, no need to map. + return d->offscreenWindow->event(e); + + default: + break; } + return QWidget::event(e); } diff --git a/src/quickwidgets/qquickwidget.h b/src/quickwidgets/qquickwidget.h index f191a2d253..92b060647f 100644 --- a/src/quickwidgets/qquickwidget.h +++ b/src/quickwidgets/qquickwidget.h @@ -115,6 +115,10 @@ protected: virtual void showEvent(QShowEvent *); virtual void hideEvent(QHideEvent *); +#ifndef QT_NO_WHEELEVENT + virtual void wheelEvent(QWheelEvent *); +#endif + bool event(QEvent *); private: -- cgit v1.2.3