2010-11-02 7 views
1

Je fais un projet de mélange d'images en utilisant QGraphics Scene. Donc, je place les images dans le QGraphicsscene comme QgraphicspixmapItem. Mais le problème est que lorsque je déplace l'itm (en faisant glisser la souris), la vue QGraphics est automatiquement agrandie. Je veux contraindre cette action. Quelqu'un peut-il m'aider dans ce domaine?QT-Graphics - Comment contraindre le mouvement de l'article

Répondre

0

Enfin, j'utilise le signal QGraphicsScene-> (cnanged).

J'ai combiné cela avec une fonction appropriée qui vérifie la position de l'élément sélectionné et le maintient dans la zone donnée.

1

Un échantillon de code minimal peut être utile. Avez-vous spécifié un sceneRect? Notez cette question:

QGraphicsView scrolling and image scaling/cropping

... et this thread on QtCentre:

Q: Les limites "dur"? En d'autres termes: Que se passe-t-il si crée un QGraphicsScene avec QGraphicsScene (0, 0, 500, 500) et que l'on essaye ensuite de mettre un item à la position (-50, -50)? R: Non, le cadre est assez flexible. En fait, si vous ne spécifiez pas une scène, elle augmentera au fur et à mesure que vous ajouterez des éléments pour englober tous.

+0

Encore le problème persiste, même après avoir ajouté le sceneRect. – prabhakaran

+0

Merci! Au moins cela m'a aidé :) – AkiRoss

1

Je suppose que vous aurez à sous-classe QGraphicsPixmapItem pour re-mettre en œuvre la méthode QGraphicsItem::itemChange().

Jetez un oeil à the help page regarding this function: il est un exemple qui montre exactement ce que vous essayez de faire:

QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value) 
{ 
    if (change == ItemPositionChange && scene()) { 
     // value is the new position. 
     QPointF newPos = value.toPointF(); 
     QRectF rect = scene()->sceneRect(); 
     if (!rect.contains(newPos)) { 
     // Keep the item inside the scene rect. 
     newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left()))); 
     newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top()))); 
     return newPos; 
     } 
    } 
    return QGraphicsItem::itemChange(change, value); 
} 
+0

Y at-il un moyen d'obtenir cela directement, plutôt que de dériver une classe – prabhakaran

+0

@prabhakaran: Je ne l'ai jamais fait (et je suppose que ce n'est pas très efficace et propre) mais peut-être que vous pourriez gérer ça le niveau de la scène: si la scène change, elle émet un signal. Vous pouvez ensuite vérifier la position de l'élément actuel et l'adapter si nécessaire avec 'QGraphicsItem :: setPos()' –

Questions connexes