2010-11-05 30 views
3

Je ne suis pas vraiment débutant dans Qt, mais il y a quelques choses que je ne sais pas ... Je programme en Python, mais n'hésitez pas à poster vos réponses dans N'IMPORTE QUELLE langue.Make QGraphicsView faire centerOn lisse

, j'ai quelques QGraphicsItem (s), placé à l'intérieur d'un QGraphicsScene, la scène est vue avec une normale QGraphicsView. Tout est normal.

Ma scène est très grande, 10 000 x 10 000 pixels, tous les éléments graphiques sont dispersés.

Par exemple:

 
# Creating Scene object. 
scene = QtGui.QGraphicsScene() 
scene.setSceneRect(0, 0, 10000, 10000) 
# Creating View object. 
view = QtGui.QGraphicsView() 
view.setScene(scene) 

# Adding some objects to scene. 
# scene.addItem(...) 
# ... 

# The list of items. 
items = scene.items() 

# This is how i center on item. 
view.centerOn(some_item) 
view.fitInView(some_item, Qt.KeepAspectRatio) 

Ma question est, comment i peut centrer la vue sur chaque élément, en utilisant quelque chose de similaire à centerOn, mais en douceur?

Actuellement, centerOn va FAST sur l'élément suivant, je veux le déplacer légèrement, peut-être en utilisant QPropertyAnimation avec courbe d'accélération?

J'ai essayé de déplacer la vue à l'article suivant en utilisant view.translate (1, 1) dans un grand cicle, mais le mouvement est trop rapide, tout comme centerOn.

J'ai essayé de mettre un peu d'attente avec time.sleep (0.01) entre la traduction, mais les blocs de fenêtres jusqu'à ce que le cicle existe ... donc c'est mauvais.

Merci beaucoup!

Répondre

2

I une fois utilisé un QTimeLine (avec EaseInOutCurve), relié à une fente, puis utilisé cette valeur pour traduire le rect vue, comme ceci:

const QRectF r = ...calculate rect translated by timeline value and trajectory... 
view->setSceneRect(r); 
view->fitInView(r, Qt::KeepAspectRatio); 

Pour la trajectoire je un QLineF avec démarrage et position de fin pour le défilement lisse. Ensuite, on peut utiliser la valeur émise par timeline bien avec QLineF :: pointAt().

Dans mon cas, j'avais besoin de régler à la fois SceneRect et fitInView pour le faire se comporter comme je le voulais.

1

J'ai résolu mon problème en plaçant une valeur élevée sur setSceneRect. Ensuite, je centraliser la scène sur un objet ou une position.

exemple:

this-> UI-> graphicsView-> setSceneRect (0,0,100000000, 100000000); this-> ui-> graphicsView-> centerOn (500,1030);

Avec la taille de setSceneRect, GraphicsView ne fonctionne pas correctement.