bool QGLGraphicsNavigationItemPrivate::handleHover(QGraphicsSceneHoverEvent *e) { if (!panning && (viewportItem->options() & QGLGraphicsViewportItem::ObjectPicking) != 0) { QObject *object = viewportItem->objectForPosition(e->pos()); if (pressedObject) { // Send the move event to the pressed object. Use a position // of (0, 0) if the mouse is still within the pressed object, // or (-1, -1) if the mouse is no longer within the pressed object. QMouseEvent event (QEvent::MouseMove, (pressedObject == object) ? QPoint(0, 0) : QPoint(-1, -1), e->screenPos(), Qt::NoButton, Qt::NoButton, e->modifiers()); QCoreApplication::sendEvent(pressedObject, &event); } else if (object) { if (object != enteredObject) { if (enteredObject) sendLeaveEvent(enteredObject); enteredObject = object; sendEnterEvent(enteredObject); } QMouseEvent event (QEvent::MouseMove, QPoint(0, 0), e->screenPos(), Qt::NoButton, Qt::NoButton, e->modifiers()); QCoreApplication::sendEvent(object, &event); } else if (enteredObject) { sendLeaveEvent(enteredObject); enteredObject = 0; } return true; } return false; }
/*! Processes the mouse move event \a e. */ void QGLView::mouseMoveEvent(QMouseEvent *e) { if (d->panning) { QPoint delta = e->pos() - d->startPan; if (e->modifiers() == d->panModifiers) { d->camera->setEye(d->startEye); d->camera->setCenter(d->startCenter); d->camera->setUpVector(d->startUpVector); } else { d->startPan = d->lastPan; delta = e->pos() - d->startPan; d->startEye = d->camera->eye(); d->startCenter = d->camera->center(); d->startUpVector = d->camera->upVector(); d->panModifiers = e->modifiers(); } d->lastPan = e->pos(); if ((e->modifiers() & Qt::ControlModifier) != 0) wheel(delta.y() * -60); else if ((e->modifiers() & Qt::ShiftModifier) != 0) pan(delta.x(), delta.y()); else rotate(delta.x(), delta.y()); } else if ((d->options & QGLView::ObjectPicking) != 0) { QObject *object = objectForPoint(e->pos()); if (d->pressedObject) { // Send the move event to the pressed object. Use a position // of (0, 0) if the mouse is still within the pressed object, // or (-1, -1) if the mouse is no longer within the pressed object. QMouseEvent event (QEvent::MouseMove, (d->pressedObject == object) ? QPoint(0, 0) : QPoint(-1, -1), e->globalPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(d->pressedObject, &event); } else if (object) { if (object != d->enteredObject) { if (d->enteredObject) sendLeaveEvent(d->enteredObject); d->enteredObject = object; sendEnterEvent(d->enteredObject); } QMouseEvent event (QEvent::MouseMove, QPoint(0, 0), e->globalPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(object, &event); } else if (d->enteredObject) { sendLeaveEvent(d->enteredObject); d->enteredObject = 0; } } QGLWidget::mouseMoveEvent(e); }
/*! Processes the leave event \a e. */ void QGLView::leaveEvent(QEvent *e) { if (!d->pressedObject && d->enteredObject) { sendLeaveEvent(d->enteredObject); d->enteredObject = 0; } QGLWidget::leaveEvent(e); }
bool QGLGraphicsNavigationItemPrivate::handleHoverLeave() { if (!pressedObject && enteredObject) { sendLeaveEvent(enteredObject); enteredObject = 0; return true; } else { return false; } }
bool QGLGraphicsNavigationItemPrivate::handleMouseMove(QGraphicsSceneMouseEvent *e) { if (panning) { QPointF delta = e->pos() - startPan; startPan = e->pos(); if ((e->modifiers() & Qt::ControlModifier) != 0) wheel(delta.y() * -60); else if ((e->modifiers() & Qt::ShiftModifier) != 0) pan(delta.x(), delta.y()); else rotate(delta.x(), delta.y()); } else if ((viewportItem->options() & QGLGraphicsViewportItem::ObjectPicking) != 0) { QObject *object = viewportItem->objectForPosition(e->pos()); if (pressedObject) { // Send the move event to the pressed object. Use a position // of (0, 0) if the mouse is still within the pressed object, // or (-1, -1) if the mouse is no longer within the pressed object. QMouseEvent event (QEvent::MouseMove, (pressedObject == object) ? QPoint(0, 0) : QPoint(-1, -1), e->screenPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(pressedObject, &event); } else if (object) { if (object != enteredObject) { if (enteredObject) sendLeaveEvent(enteredObject); enteredObject = object; sendEnterEvent(enteredObject); } QMouseEvent event (QEvent::MouseMove, QPoint(0, 0), e->screenPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(object, &event); } else if (enteredObject) { sendLeaveEvent(enteredObject); enteredObject = 0; } } else { return false; } return true; }
/*! Processes the mouse release event \a e. */ void QGLView::mouseReleaseEvent(QMouseEvent *e) { if (d->panning && e->button() == Qt::LeftButton) { d->panning = false; #ifndef QT_NO_CURSOR unsetCursor(); #endif } if (d->pressedObject) { // Notify the previously pressed object about the release. QObject *object = objectForPoint(e->pos()); QObject *pressed = d->pressedObject; if (e->button() == d->pressedButton) { d->pressedObject = 0; d->pressedButton = Qt::NoButton; d->enteredObject = object; // Send the release event to the pressed object. Use a position // of (0, 0) if the mouse is still within the pressed object, // or (-1, -1) if the mouse is no longer within the pressed object. QMouseEvent event (QEvent::MouseButtonRelease, (pressed == object) ? QPoint(0, 0) : QPoint(-1, -1), e->globalPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(pressed, &event); // Send leave and enter events if necessary. if (object != pressed) { sendLeaveEvent(pressed); if (object) sendEnterEvent(object); } } else { // Some other button than the original was released. // Forward the event to the pressed object. QMouseEvent event (QEvent::MouseButtonRelease, (pressed == object) ? QPoint(0, 0) : QPoint(-1, -1), e->globalPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(pressed, &event); } } QGLWidget::mouseReleaseEvent(e); }
bool QGLGraphicsNavigationItemPrivate::handleMouseRelease(QGraphicsSceneMouseEvent *e) { if (panning && e->button() == Qt::LeftButton) { panning = false; #ifndef QT_NO_CURSOR viewportItem->unsetCursor(); #endif } if (pressedObject) { // Notify the previously pressed object about the release. QObject *object = viewportItem->objectForPosition(e->pos()); QObject *pressed = pressedObject; if (e->button() == pressedButton) { pressedObject = 0; pressedButton = Qt::NoButton; enteredObject = object; // Send the release event to the pressed object. Use a position // of (0, 0) if the mouse is still within the pressed object, // or (-1, -1) if the mouse is no longer within the pressed object. QMouseEvent event (QEvent::MouseButtonRelease, (pressed == object) ? QPoint(0, 0) : QPoint(-1, -1), e->screenPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(pressed, &event); // Send leave and enter events if necessary. if (object != pressed) { sendLeaveEvent(pressed); if (object) sendEnterEvent(object); } } else { // Some other button than the original was released. // Forward the event to the pressed object. QMouseEvent event (QEvent::MouseButtonRelease, (pressed == object) ? QPoint(0, 0) : QPoint(-1, -1), e->screenPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(pressed, &event); } } return true; }