Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: INZER от Март 20, 2015, 11:52



Название: [РЕШЕНО] Плавное перемещение 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 &centerPoint)
{
    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