2011-03-24 2 views
0

J'ai la situation suivante ici: je fais un dessin sur une scène graphique, dans un type de widget central, et parfois cela implique aussi de faire défiler la scène. Ensuite, l'utilisateur clique ailleurs dans l'application, le widget central est changé en quelque chose d'autre (et les positions de la barre de défilement des vues graphiques sont sauvegardées quelque part). Maintenant, l'utilisateur veut revenir à la scène graphique, je redessine la scène (en recréant toute la fenêtre de visualisation graphique, car lorsque l'utilisateur était en dehors de la scène graphique, il changeait certaines valeurs qui devaient être changées dans la vue graphique) et quand je veux définir les positions de défilement précédentes, j'appelle la méthode suivante:QGraphicsView scroll problem

void GraphicsForm::scrollTo(int hor, int ver) 
{ 
    m_qgv->horizontalScrollBar()->setValue(hor); 
    m_qgv->verticalScrollBar()->setSliderPosition(ver); 
} 

et cela est censé repositionner la barre de défilement pour les valeurs précédentes (Hor, ver) enregistrée avant que je changé la vue (m_qgv est un objet QGraphicsView). Le problème est que ni les valeurs horizontales, ni les valeurs verticales ne sont restaurées correctement (elles sont enregistrées correctement en utilisant le horizontal/verticalScrollBar()->sliderPosition() avant de masquer la scène), de sorte que les barres de défilement ne bougent pas autant qu'elles étaient avant la fenêtre changer, ils se déplacent beaucoup plus moins ...

Des idées, des suggestions comment puis-je revenir aux coordonnées du défilement précédent?

Répondre

2

Si le rectangle de la scène change après l'édition par l'utilisateur, la position de défilement enregistrée ne sera plus valide puisque les nouveaux min/max sont maintenant différents.

Recentrage la scène peut être une meilleure solution:

QPointF center = my_qgv->viewPort().rect().center(); 
center = my_qgv->mapToScene(center); 
... 
// user edit; reconstruct scene 
// 
my_qgv->centerOn(center); 
+0

oeuvres, Merci Maître :) – fritzone