bool QQuickMouseArea::setPressed(Qt::MouseButton button, bool p) { Q_D(QQuickMouseArea); #ifndef QT_NO_DRAGANDDROP bool dragged = d->drag && d->drag->active(); #else bool dragged = false; #endif bool wasPressed = d->pressed & button; bool isclick = wasPressed && p == false && dragged == false && d->hovered == true; Qt::MouseButtons oldPressed = d->pressed; if (wasPressed != p) { QQuickMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, isclick, d->longPress); if (p) { d->pressed |= button; if (!d->doubleClick) emit pressed(&me); me.setPosition(d->lastPos); emit mouseXChanged(&me); me.setPosition(d->lastPos); emit mouseYChanged(&me); if (!oldPressed) { emit pressedChanged(); emit containsPressChanged(); } emit pressedButtonsChanged(); } else { d->pressed &= ~button; emit released(&me); me.setPosition(d->lastPos); if (!d->pressed) { emit pressedChanged(); emit containsPressChanged(); } emit pressedButtonsChanged(); if (isclick && !d->longPress && !d->doubleClick){ me.setAccepted(d->isClickConnected()); emit clicked(&me); if (!me.isAccepted()) d->propagate(&me, QQuickMouseAreaPrivate::Click); } } return me.isAccepted(); } return false; }
void QQuickMouseArea::ungrabMouse() { Q_D(QQuickMouseArea); if (d->pressed) { // if our mouse grab has been removed (probably by Flickable), fix our // state d->pressed = 0; d->stealMouse = false; d->doubleClick = false; setKeepMouseGrab(false); #ifndef QT_NO_DRAGANDDROP if (d->drag) d->drag->setActive(false); #endif emit canceled(); emit pressedChanged(); emit containsPressChanged(); emit pressedButtonsChanged(); if (d->hovered && !isUnderMouse()) { d->hovered = false; emit hoveredChanged(); } } }
bool QQuickMouseArea::sendMouseEvent(QMouseEvent *event) { Q_D(QQuickMouseArea); QPointF localPos = mapFromScene(event->windowPos()); QQuickWindow *c = window(); QQuickItem *grabber = c ? c->mouseGrabberItem() : 0; bool stealThisEvent = d->stealMouse; if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab())) { QMouseEvent mouseEvent(event->type(), localPos, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers()); mouseEvent.setAccepted(false); switch (event->type()) { case QEvent::MouseMove: mouseMoveEvent(&mouseEvent); break; case QEvent::MouseButtonPress: mousePressEvent(&mouseEvent); break; case QEvent::MouseButtonRelease: mouseReleaseEvent(&mouseEvent); stealThisEvent = d->stealMouse; break; default: break; } grabber = c ? c->mouseGrabberItem() : 0; if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) grabMouse(); return stealThisEvent; } if (event->type() == QEvent::MouseButtonRelease) { if (d->pressed) { d->pressed &= ~event->button(); emit pressedButtonsChanged(); if (!d->pressed) { // no other buttons are pressed d->stealMouse = false; if (c && c->mouseGrabberItem() == this) ungrabMouse(); emit canceled(); emit pressedChanged(); emit containsPressChanged(); if (d->hovered) { d->hovered = false; emit hoveredChanged(); } } } } return false; }
void QQuickMouseArea::ungrabMouse() { Q_D(QQuickMouseArea); if (d->pressed) { // if our mouse grab has been removed (probably by Flickable), fix our // state d->pressed = 0; d->stealMouse = false; setKeepMouseGrab(false); emit canceled(); emit pressedChanged(); emit pressedButtonsChanged(); if (d->hovered) { d->hovered = false; emit hoveredChanged(); } } }