2010-11-21 18 views

Répondre

3

Je suggère de faire quelque chose comme ce qui suit:

  1. Obtenez le rect bondissant de tous les éléments de la scène à l'aide QGraphicsScene::itemsBoundingRect().
  2. Ajoutez un peu de marge autour de ce rect pour vous assurer que les limites des éléments n'atteindront pas le bord de la vue. Quelque chose comme myRect.adjust(-20, -20, 20, 20) devrait suffire.
  3. Utilisez QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio) pour vous assurer que la zone prise est dans les limites visibles de la vue.

Cela devrait le faire. Ce code devrait être appelé chaque fois que quelque chose a changé dans la scène. Vous pouvez utiliser la fonction QRectF :: intersects() pour savoir si le nouveau rect a été placé sur le bord de la vue.

Quelle est la meilleure façon d'agrandir une scène graphique dans ce cas?

Le GraphicsScene est un système de coordonnées infini. La plupart des clients utilisent itemsBoundingRect() pour avoir une idée de l'espace réellement utilisé par les éléments de la scène. Si vous avez effacé la scène, vous pouvez appeler le QGraphicsScene::setSceneRect(QRectF()) pour le rendre plus petit.

Espérons que ça aide.

+0

+1 pour une réponse claire. Mais que se passe-t-il si je ne veux pas que le contenu soit redimensionné pour s'adapter à l'écran et utiliser une solution de barre de défilement à la place? – Pieter

+0

Attendez, je l'ai trouvé ... Je dois utiliser 'setSceneRect' dans la vue graphique. – Pieter

0

désolé si c'est un peu en retard (6 ans) mais je fournirai une réponse si quelqu'un est encore aux prises avec cela ou veut une autre approche.I implémenter cela dans mouseReleaseEvent dans la classe personnalisée dériver de QgraphicsObject. Notez que j'initialise la taille de mon QgraphicsScene (1000,1000) avec le code suivant. scene->setSceneRect(0,0,1000,1000). Alors voici ce que mon code va faire. Si l'élément (l'élément est déplaçable) placé contre la bordure, cette bordure augmentera. Voici donc mon code:

void MyItem::mouseReleaseEvent(QgraphicsceneMouseEvent* event){ 
    QRectF tempRect = this->scene()->sceneRect(); 
    if(this->scenePos().y() < this->scene()->sceneRect().top()){ 
     tempRect.adjust(0,-200,0,0); 
     if(this->scenePos().x() < this->scene()->sceneRect().left()){ 
      tempRect.adjust(-200,0,0,0); 
     } 
     else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){ 
     tempRect.adjust(0,0,200,0); 
     } 
    } 
    else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){ 
     tempRect.adjust(0,0,0,200); 
     if(this->scenePos().x() < this->scene()->sceneRect().left()){ 
      tempRect.adjust(-200,0,0,0); 
    } 
    else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){ 
     tempRect.adjust(0,0,200,0); 
    } 
} 
else if(this->scenePos().x() < this->scene()->sceneRect().left()){ 
     tempRect.adjust(-200,0,0,0); 
     if(this->scenePos().y() < this->scene()->sceneRect().top()){ 
      tempRect.adjust(0,-200,0,0); 
     } 
     else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){ 
      tempRect.adjust(0,0,0,200); 
     } 
    } 
    else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){ 
     tempRect.adjust(0,0,200,0); 
     if(this->scenePos().y() < this->scene()->sceneRect().top()){ 
      tempRect.adjust(0,-200,0,0); 
     } 
     else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){ 
      tempRect.adjust(0,0,0,200); 
     } 
    } 

    this->scene()->setSceneRect(tempRect);