diff options
Diffstat (limited to 'src/quickwidgets/qquickwidget.cpp')
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 6d27e09780..d316d12588 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -664,6 +664,7 @@ QQuickWidget::QQuickWidget(QWidget *parent) { setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); + setAttribute(Qt::WA_AcceptTouchEvents); d_func()->init(); } @@ -1638,9 +1639,23 @@ bool QQuickWidget::event(QEvent *e) case QEvent::TouchBegin: case QEvent::TouchEnd: case QEvent::TouchUpdate: - case QEvent::TouchCancel: + case QEvent::TouchCancel: { // Touch events only have local and global positions, no need to map. - return QCoreApplication::sendEvent(d->offscreenWindow, e); + bool res = QCoreApplication::sendEvent(d->offscreenWindow, e); + if (e->isAccepted() && e->type() == QEvent::TouchBegin) { + // If the TouchBegin got accepted, then make sure all points that have + // an exclusive grabber are also accepted so that the widget code for + // delivering touch events make this widget an implicit grabber of those + // points. + QPointerEvent *pointerEvent = static_cast<QPointerEvent *>(e); + auto deliveredPoints = pointerEvent->points(); + for (auto &point : deliveredPoints) { + if (pointerEvent->exclusiveGrabber(point)) + point.setAccepted(true); + } + } + return res; + } case QEvent::FocusAboutToChange: return QCoreApplication::sendEvent(d->offscreenWindow, e); |