Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to pan images in QGraphicsView

Tags:

I am currently able to load my image into a grahpics scene, and then again into a QGraphicsViewer.

I am able to implement a zoom feature by dtecting a QEvent::Wheel and then calling the graphicsViews's scale() function.

However, I can't seem to figure out how to get the pan functionality working. I basically want to detect when a mouse has clicked down on the image, and then move the image left, right, up or down along with the mouse.

As of right now, I basically have a MouseFilter class that is detecting events, and doing different things depending on the event type. I attached that listener to the QGraphicsView object

like image 765
Derek Avatar asked Jan 20 '11 23:01

Derek


1 Answers

In case someone is wondering how to do it on their own, it's actually quite simple. Here's the code from my app:

class ImageView : public QGraphicsView { public:     ImageView(QWidget *parent);     ~ImageView();  private:     virtual void mouseMoveEvent(QMouseEvent *event);     virtual void mousePressEvent(QMouseEvent *event);     virtual void mouseReleaseEvent(QMouseEvent *event);      bool _pan;     int _panStartX, _panStartY; }; 

You need to store the start position of the drag, for example like this (I used the right button):

void ImageView::mousePressEvent(QMouseEvent *event) {     if (event->button() == Qt::RightButton)     {         _pan = true;         _panStartX = event->x();         _panStartY = event->y();         setCursor(Qt::ClosedHandCursor);         event->accept();         return;     }     event->ignore(); } 

Also, you need to clear the flag and restore the cursor once the button is released:

void ImageView::mouseReleaseEvent(QMouseEvent *event) {     if (event->button() == Qt::RightButton)     {         _pan = false;         setCursor(Qt::ArrowCursor);         event->accept();         return;     }     event->ignore(); } 

To actually manage the drag, you need to override the mouse move event. QGraphicsView inherits a QAbstractScrollArea, and its scrollbars are easily accessible. You also need to update the pan position:

void ImageView::mouseMoveEvent(QMouseEvent *event) {     if (_pan)     {         horizontalScrollBar()->setValue(horizontalScrollBar()->value() - (event->x() - _panStartX));         verticalScrollBar()->setValue(verticalScrollBar()->value() - (event->y() - _panStartY));         _panStartX = event->x();         _panStartY = event->y();         event->accept();         return;     }     event->ignore();  } 
like image 188
neuviemeporte Avatar answered Sep 24 '22 20:09

neuviemeporte