Название: [РЕШЕНО] Плавное перемещение QGraphicsView
Отправлено: INZER от Март 20, 2015, 11:52
1) Реализовано перемещение вью, используя нажатие кнопки мыши. Перемещение происходит какими-то рывками, хочется добиться более плавного эффекта. Как возможно это реализовать? 2) При нажатии кнопки мыши изображение курсора не изменяется. Почему? Текущий код: class MapGraphicView: public QGraphicsView { ... protected: QPointF center; // The center of visible area QPointF fixedPoint; // Fixation point (for scrolling) void setCenter (const QPointF& centerPoint); QPointF getCenter (); virtual void mousePressEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); ... };
void MapGraphicView::mousePressEvent(QMouseEvent *event) { fixedPoint = event->pos(); setCursor(Qt::ClosedHandCursor); QGraphicsView::mousePressEvent(event); }
void MapGraphicView::mouseReleaseEvent(QMouseEvent *event) { fixedPoint = QPoint (); setCursor(Qt::OpenHandCursor); QGraphicsView::mouseReleaseEvent(event); }
void MapGraphicView::mouseMoveEvent(QMouseEvent *event) { if (!fixedPoint.isNull()) { QPointF offset = mapToScene(fixedPoint.toPoint()) - mapToScene(event->pos()); fixedPoint = event->pos(); setCenter(getCenter() + offset); setCursor(Qt::ClosedHandCursor); } QGraphicsView::mouseMoveEvent(event); }
void MapGraphicView::setCenter(const QPointF ¢erPoint) { QRectF visibleArea = mapToScene(rect()).boundingRect(); // Border of the visible area QRectF sceneBounds = sceneRect(); // Scene's border double boundX = visibleArea.width()/2.0; double boundY = visibleArea.height()/2.0; double boundWidth = sceneBounds.width() - visibleArea.width(); double boundHeight = sceneBounds.height() - visibleArea.height(); QRectF bounds (boundX, boundY, boundWidth, boundHeight); center = centerPoint;
if (!bounds.contains(centerPoint)) { if (visibleArea.contains(sceneBounds)) { center = sceneBounds.center(); } else { if (centerPoint.x() > bounds.x() + bounds.width()) center.setX(bounds.x() + bounds.width()); else if (center.x() < bounds.x()) center.setX(bounds.x());
if (centerPoint.y() > bounds.y() + bounds.height()) center.setY(bounds.y() + bounds.height()); else if (centerPoint.y() < bounds.y()) center.setY(bounds.y()); } centerOn(center); } }
QPointF MapGraphicView::getCenter() { return center; }
Заранее спасибо!
Название: Re: Плавное перемещение QGraphicsView
Отправлено: GreatSnake от Март 20, 2015, 11:55
1) Чем не устроил готовый QGraphicsView::setDragMode( QGraphicsView::ScrollHandDrag ) ? 2) Курсор выставлять надо на QGraphicsView::viewport().
Название: Re: Плавное перемещение QGraphicsView
Отправлено: INZER от Март 20, 2015, 12:19
1) Чем не устроил готовый QGraphicsView::setDragMode( QGraphicsView::ScrollHandDrag ) ? 2) Курсор выставлять надо на QGraphicsView::viewport().
Спасибо! Второй вопрос отпал сам собой после применения пункта 1
|