--- qtdeclarative/src/quick/items/qquickevents.cpp Mon Nov 19 13:39:18 2018 +++ qtdeclarative/src/quick/items/qquickevents.cpp Sun Jan 06 12:03:15 2019 @@ -1610,8 +1610,8 @@ Qt::TouchPointStates QQuickPointerTouchEvent::touchPointStates() const { - return m_event - ? static_cast(m_event)->touchPointStates() + return m_event && dynamic_cast(m_event) + ? dynamic_cast(m_event)->touchPointStates() : Qt::TouchPointStates(); } --- qtdeclarative/src/quick/items/qquickevents_p_p.h Mon Nov 19 13:39:18 2018 +++ qtdeclarative/src/quick/items/qquickevents_p_p.h Sun Jan 06 12:05:08 2019 @@ -491,8 +491,8 @@ bool isDoubleClickEvent() const override; bool isUpdateEvent() const override; bool isReleaseEvent() const override; - QQuickPointerMouseEvent *asPointerMouseEvent() override { return this; } - const QQuickPointerMouseEvent *asPointerMouseEvent() const override { return this; } + QQuickPointerMouseEvent *asPointerMouseEvent() override { return m_event && dynamic_cast(m_event)? this : nullptr; } + const QQuickPointerMouseEvent *asPointerMouseEvent() const override { return m_event && dynamic_cast(m_event)? this : nullptr; } QMouseEvent *asMouseEvent(const QPointF& localPos) const; @@ -513,8 +513,8 @@ bool isPressEvent() const override; bool isUpdateEvent() const override; bool isReleaseEvent() const override; - QQuickPointerTouchEvent *asPointerTouchEvent() override { return this; } - const QQuickPointerTouchEvent *asPointerTouchEvent() const override { return this; } + QQuickPointerTouchEvent *asPointerTouchEvent() override { return m_event && dynamic_cast(m_event)? this : nullptr; } + const QQuickPointerTouchEvent *asPointerTouchEvent() const override { return m_event && dynamic_cast(m_event)? this : nullptr; } int pointCount() const override { return m_pointCount; } QQuickEventPoint *point(int i) const override; QQuickEventPoint *pointById(int pointId) const override; --- qtdeclarative/src/quick/items/qquickwindow.cpp Mon Nov 19 13:39:18 2018 +++ qtdeclarative/src/quick/items/qquickwindow.cpp Wed Jan 16 17:01:03 2019 @@ -2488,6 +2488,7 @@ int pointCount = event->pointCount(); for (int i = 0; i < pointCount; ++i) { QQuickEventPoint *point = event->point(i); + if (!point) continue; deliverToPassiveGrabbers(point->passiveGrabbers(), event); } @@ -2499,6 +2500,7 @@ QVector targetItems; for (int i = 0; i < pointCount; ++i) { QQuickEventPoint *point = event->point(i); + if (!point) continue; if (point->state() == QQuickEventPoint::Pressed) continue; // presses were delivered earlier; not the responsibility of deliverUpdatedTouchPoints QVector targetItemsForPoint = pointerTargets(contentItem, point, false, false); @@ -2526,8 +2528,9 @@ int pointCount = event->pointCount(); QVector targetItems; bool isTouchEvent = (event->asPointerTouchEvent() != nullptr); + QQuickEventPoint *pt = nullptr; if (isTouchEvent && event->isPressEvent() && isDeliveringTouchAsMouse() && - pointerEventInstance(touchMouseDevice)->pointById(touchMouseId)->grabberPointerHandler()) { + (pt = pointerEventInstance(touchMouseDevice)->pointById(touchMouseId)) && pt->grabberPointerHandler()) { // When a second point is pressed, if the first point's existing // grabber was a pointer handler while a filtering parent is filtering // the same first point _as mouse_: we're starting over with delivery, @@ -2563,7 +2566,7 @@ if (!handlersOnly && sendFilteredPointerEvent(event, item)) { if (event->isAccepted()) { for (int i = 0; i < event->pointCount(); ++i) - event->point(i)->setAccepted(); + if (auto p = event->point(i)) p->setAccepted(); return true; } skipDelivery.append(item); @@ -2611,11 +2614,13 @@ auto event = pointerEvent->asPointerMouseEvent(); if (event && item->acceptedMouseButtons() & event->button()) { auto point = event->point(0); + if (!point) return; // The only reason to already have a mouse grabber here is // synthetic events - flickable sends one when setPressDelay is used. auto oldMouseGrabber = q->mouseGrabberItem(); QPointF localPos = item->mapFromScene(point->scenePosition()); QMouseEvent *me = event->asMouseEvent(localPos); + if (!me) return; me->accept(); QCoreApplication::sendEvent(item, me); if (me->isAccepted()) {