13

here i have a scene and a associated view ,then i hava a position in the scene coordinates.I want to set the center of the viewport with the position.How can i do it? I try to use the translate() function but it didn't work?

view->translate(10, 10);

The viewport should move with the delta x 10, and delta y 10, but it didn't work!

Ticks
  • 528
  • 1
  • 5
  • 11
  • Use QGraphicsView::centerOn for centering. What exactly didn't work about translate? What's the current viewport position and the dimensions of your scene (sceneRect())? – Frank Osterfeld Jan 30 '13 at 20:54
  • I'm seeing this same thing. I can set a translated `QTransform` or I can use `QGraphicsView::translate()` and nothing happens. Kind of frustrating. – Cory Klein Aug 09 '13 at 21:10

4 Answers4

6

You need to set the transformation anchor mode of the graphics view to NoAnchor.

setTransformationAnchor(QGraphicsView::NoAnchor);

This prevents the graphics view from undoing the translation as expected by the other anchor modes (AnchorViewCenter, AnchorUnderMouse).

Gearoid Murphy
  • 11,834
  • 17
  • 68
  • 86
3

Center

As said Frank Osterfeld, to center your viewport at a given position, you can simply use the function centerOn.

Translate

But to translate your viewport, it exists another way that consists to change your scrollbars position :

// Your graphics view
QGraphicsView *view;

// dx, dy corresponds to your translation
int dx, dy;

// Change scrollbars position
view->horizontalScrollBar()->setValue( view->horizontalScrollBar()->value() + dx );
view->verticalScrollBar()->setValue( view->verticalScrollBar()->value() + dy );

Render

If needed, you can also hide the scrollbars :

// Hide the scrollbars
view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
view->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
Rémi
  • 525
  • 1
  • 15
  • 26
2

I used the following workaround:

QTransform old_transform = transform();

QRectF scene_rect = scene()->sceneRect();
QRectF new_scene_rect(scene_rect.x()-translation.x(),
                      scene_rect.y()-translation.y(),
                      scene_rect.width(),scene_rect.height());
scene()->setSceneRect(new_scene_rect);

setTransform(old_transform);

The transform part was necessary since otherwise it resets scaling.

This solution is essentially forcing it to change where it is allowed look at, which it is far from elegant.

I hope that somebody else comes up with a clean answer that allows to actually use the translate method as intended.

Note that I use Qt 4.85, might be different with newer versions.

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Aziuth
  • 3,652
  • 3
  • 18
  • 36
0

See the Bug Report, along with work around.

Drew McGowen
  • 11,471
  • 1
  • 31
  • 57