How to use the QGraphicsView's translate() function?

后端 未结 4 724
暖寄归人
暖寄归人 2021-01-11 14:07

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

相关标签:
4条回答
  • 2021-01-11 14:45

    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.

    0 讨论(0)
  • 2021-01-11 14:49

    See the Bug Report, along with work around.

    0 讨论(0)
  • 2021-01-11 14:57

    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 );
    
    0 讨论(0)
  • 2021-01-11 14:58

    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).

    0 讨论(0)
提交回复
热议问题