QTouchEvent *TouchDispatcher::createQTouchEvent(QEvent::Type eventType, QTouchDevice *device, Qt::KeyboardModifiers modifiers, const QList<QTouchEvent::TouchPoint> &touchPoints, QWindow *window, ulong timestamp) { Qt::TouchPointStates eventStates = 0; for (int i = 0; i < touchPoints.count(); i++) eventStates |= touchPoints[i].state(); // if all points have the same state, set the event type accordingly switch (eventStates) { case Qt::TouchPointPressed: eventType = QEvent::TouchBegin; break; case Qt::TouchPointReleased: eventType = QEvent::TouchEnd; break; default: eventType = QEvent::TouchUpdate; break; } QTouchEvent *touchEvent = new QTouchEvent(eventType); touchEvent->setWindow(window); touchEvent->setTarget(m_targetItem.data()); touchEvent->setDevice(device); touchEvent->setModifiers(modifiers); touchEvent->setTouchPoints(touchPoints); touchEvent->setTouchPointStates(eventStates); touchEvent->setTimestamp(timestamp); touchEvent->accept(); return touchEvent; }
void TestHsDomainModel::testWidgetTouchAreaSceneEvent() { HsWidgetHost *widget = new HsWidgetHost(-1); HsWidgetTouchArea *widgetTouchArea = new HsWidgetTouchArea(widget->visual()); HsScene *scene = HsScene::instance(); // test shape fetch QPainterPath *path = new QPainterPath(widgetTouchArea->shape()); QVERIFY(path); delete path; QSignalSpy widgetTapStartedSpy(scene, SIGNAL(widgetTapStarted(QPointF,HsWidgetHost*))); QSignalSpy widgetMoveFinishedSpy(scene, SIGNAL(widgetMoveFinished(const QPointF &, HsWidgetHost*))); // test touch begin QTouchEvent::TouchPoint touchPoint; QList<QTouchEvent::TouchPoint> touchPoints; touchPoints.append(touchPoint); QTouchEvent *touchEvent = new QTouchEvent(QEvent::TouchBegin); touchEvent->setTouchPoints(touchPoints); widgetTouchArea->sceneEvent(touchEvent); QCOMPARE(widgetTapStartedSpy.count(), 1); delete widgetTouchArea; delete widget; }
void RenderableWebEntityItem::handlePointerEvent(const PointerEvent& event) { // Ignore mouse interaction if we're locked if (getLocked() || !_webSurface) { return; } glm::vec2 windowPos = event.getPos2D() * (METERS_TO_INCHES * _dpi); QPointF windowPoint(windowPos.x, windowPos.y); if (event.getType() == PointerEvent::Move) { // Forward a mouse move event to webSurface QMouseEvent* mouseEvent = new QMouseEvent(QEvent::MouseMove, windowPoint, windowPoint, windowPoint, Qt::NoButton, Qt::NoButton, Qt::NoModifier); QCoreApplication::postEvent(_webSurface->getWindow(), mouseEvent); } { // Forward a touch update event to webSurface if (event.getType() == PointerEvent::Press) { this->_pressed = true; } else if (event.getType() == PointerEvent::Release) { this->_pressed = false; } QEvent::Type type; Qt::TouchPointState touchPointState; switch (event.getType()) { case PointerEvent::Press: type = QEvent::TouchBegin; touchPointState = Qt::TouchPointPressed; break; case PointerEvent::Release: type = QEvent::TouchEnd; touchPointState = Qt::TouchPointReleased; break; case PointerEvent::Move: default: type = QEvent::TouchUpdate; touchPointState = Qt::TouchPointMoved; break; } QTouchEvent::TouchPoint point; point.setId(event.getID()); point.setState(touchPointState); point.setPos(windowPoint); point.setScreenPos(windowPoint); QList<QTouchEvent::TouchPoint> touchPoints; touchPoints.push_back(point); QTouchEvent* touchEvent = new QTouchEvent(type); touchEvent->setWindow(nullptr); touchEvent->setDevice(nullptr); touchEvent->setTarget(nullptr); touchEvent->setTouchPoints(touchPoints); touchEvent->setTouchPointStates(touchPointState); _lastTouchEvent = *touchEvent; QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent); } }