2010-05-25 6 views
2

Je vais faire du pan/scale sur QGraphicsView.
Donc, j'ai lu la documentation de QGraphicsView et voir quelques fonctions d'utilité comme ensureVisible() et centerOn().
Je pense que je comprends ce que dit la documentation mais je n'arrive pas à écrire un exemple de travail.
Pourriez-vous s'il vous plaît écrire/suggérer un code d'exemple pour comprendre le problème.QGraphicsView ensureVisible() et centerOn()

+0

Vous voulez dire panoramique et échelle avec la souris? Ou adapter un ensemble d'objets dans la vue? –

+0

Je suppose qu'il y aura une opération d'ajustement aussi là peut-être une opération pan/échelle avec la souris. – onurozcelik

Répondre

3

Ton panoramique de la vue d'un certain montant (par exemple dans de mouseMoveEvent() votre point de vue), en supposant MyView est une sous-classe de QGraphicsView (tout le code suivant a été porté de Python, je ne l'ai pas le tester):

void MyView::moveBy(QPoint &delta) 
{ 
    QScrollBar *horiz_scroll = horizontalScrollBar(); 
    QScrollBar *vert_scroll = verticalScrollBar(); 
    horiz_scroll->setValue(horiz_scroll.value() - delta.x()); 
    vert_scroll->setValue(vert_scroll.value() - delta.y()); 
} 

pour installer un rectangle spécifié en scène coordonnées en effectuant un zoom et panoramique:

void MyView::fit(QRectF &rect) 
{ 
    setSceneRect(rect); 
    fitInView(rect, Qt::KeepAspectRatio); 
} 

Notez que si votre scène contient des éléments non transformables (avec le drapeau QGraphicsItem::ItemIgnoresTransformations), vous devrez prendre e étapes xtra pour calculer leur zone de délimitation correcte:

/** 
* Compute the bounding box of an item in scene space, handling non 
* transformable items. 
*/ 
QRectF sceneBbox(QGraphicsItem *item, QGraphicsItemView *view=NULL) 
{ 
    QRectF bbox = item->boundingRect(); 
    QTransform vp_trans, item_to_vp_trans; 

    if (!(item->flags() & QGraphicsItem::ItemIgnoresTransformations)) { 
     // Normal item, simply map its bounding box to scene space 
     bbox = item->mapRectToScene(bbox); 
    } else { 
     // Item with the ItemIgnoresTransformations flag, need to compute its 
     // bounding box with deviceTransform() 
     if (view) { 
      vp_trans = view->viewportTransform(); 
     } else { 
      vp_trans = QTransform(); 
     } 
     item_to_vp_trans = item->deviceTransform(vp_trans); 
     // Map bbox to viewport space 
     bbox = item_to_vp_trans.mapRect(bbox); 
     // Map bbox back to scene space 
     bbox = vp_trans.inverted().mapRect(bbox); 
    } 

    return bbox; 
} 

Dans ce cas, le rect bondissant de vos objets devient dépendant du niveau de zoom de la vue, ce qui signifie que parfois MyView::fit() ne correspondra pas exactement à vos objets (par exemple lors du montage d'un sélection d'objets à partir d'une vue largement réduite). Une solution rapide et sale consiste à appeler le MyView::fit() à plusieurs reprises jusqu'à ce que le rectangle englobant se «stabilise» automatiquement.

Questions connexes