Russian Qt Forum
Ноябрь 22, 2024, 22:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Плавное перемещение QGraphicsView  (Прочитано 4172 раз)
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;
}

Заранее спасибо!
« Последнее редактирование: Март 20, 2015, 12:20 от INZER » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 20, 2015, 11:55 »

1) Чем не устроил готовый QGraphicsView::setDragMode( QGraphicsView::ScrollHandDrag ) ?
2) Курсор выставлять надо на QGraphicsView::viewport().
« Последнее редактирование: Март 20, 2015, 11:57 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
INZER
Гость
« Ответ #2 : Март 20, 2015, 12:19 »

1) Чем не устроил готовый QGraphicsView::setDragMode( QGraphicsView::ScrollHandDrag ) ?
2) Курсор выставлять надо на QGraphicsView::viewport().

Спасибо!
Второй вопрос отпал сам собой после применения пункта 1
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.