Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scrolling QGraphicsView programmatically

Tags:

python

qt

I've want to implement a scroll/pan-feature on a QGraphicsView in my (Py)Qt application. It's supposed to work like this: The user presses the middle mouse button, and the view scrolls as the user moves the mouse (this is quite a common feature).
I tried using the scroll() method inherited from QWidget. However, this somehow moves the view instead - scrollbars and all. See picture.
So, given that this is not the way I'm supposed to do this, how should I? Or is it the correct way, but I do something else wrong? The code I use:

   def __init__(self):
       ...

       self.ui.imageArea.mousePressEvent=self.evImagePress
       self.ui.imageArea.mouseMoveEvent=self.evMouseMove

       self.scrollOnMove=False
       self.scrollOrigin=[]

       ...

   def evImagePress(self, event):
        if event.button() == Qt.LeftButton:
            self.evImageLeftClick(event)
        if event.button() == Qt.MidButton:
            self.scrollOnMove=not self.scrollOnMove
            if self.scrollOnMove:
                self.scrollOrigin=[event.x(), event.y()]
   ...

   def evMouseMove(self, event):
        if self.scrollOnMove:
            self.ui.imageArea.scroll(event.x()-self.scrollOrigin[0],
                                     event.y()-self.scrollOrigin[1])

It works as I expect, except for the whole move-the-widget business.

Fails to scroll http://img55.imageshack.us/img55/3222/scrollfail.jpg

like image 713
carlpett Avatar asked Oct 18 '25 23:10

carlpett


2 Answers

My addition to translate() method. It works great unless you scale the scene. If you do this, you'll notice, that the image is not in sync with your mouse movements. That's when mapToScene() comes to help. You should map your points from mouse events to scene coordinates. Then the mapped difference goes to translate(), voila viola- your scene follows your mouse with a great precision.

For example:

QPointF tmp2 = mapToScene(event->pos());
QPointF tmp = tmp2.mapToScene(previous_point);
translate(tmp.x(),tmp.y());
like image 62
PF4Public Avatar answered Oct 21 '25 13:10

PF4Public


I haven't done this myself but this is from the QGraphicsView documentation

... When the scene is larger than the scroll bars' values, you can choose to use translate() to navigate the scene instead.

By using scroll you are moving the widget, translate should achieve what you are looking for, moving the contents of the QGraphicsScene underneath the view

like image 32
Harald Scheirich Avatar answered Oct 21 '25 13:10

Harald Scheirich



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!