4. Zoom à la souris
Après avoir joué un peu avec l'application, on se rend compte qu'on atteint assez vite
les limites du système lorsque les carrés deviennent trop petits : le pointeur main
occulte les détails et on ne voit plus exactement sur quel carré on clique. Une fonction
zoom est donc ardemment requise.
On a vu au chapitre précédent comment commander le zoom via un widget curseur
(QSlider). Au niveau de l'ergonomie, ceci n'est clairement pas la technique la plus
adaptée, car on impose à l'utilisateur de déplacer le curseur souris sur un widget hors
de la scène. Au lieu de cela, nous allons programmer le zoom via la molette de la
souris et, en alternative, via le clavier. Dans les deux cas, on fera en sorte que le zoom
soit centré sur la position du pointeur souris, ce qui est la norme dans les applications
cartographiques.
Commençons par le zoom via la molette de la souris. Selon la philosophie du
framework, le seul point à modifier est l'implémentation de la vue, c'est-à-dire la
classe VueMosaiQ.
…
class VueMosaiQ(QGraphicsView):
def __init__(self,scene):
…
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
def wheelEvent(self,event): self.zoom(event.angleDelta().y()/100.0) def
zoom(self,facteur): if facteur < 0.0: facteur = -1.0 / facteur self.scale(facteur,facteur)
Cette instruction définit un point d'ancrage pour les transformations de la vue (le
zoom notamment), c'est-à-dire un point dont les coordonnées vue ne seront pas
affectées par la transformation. Par défaut, le point d'ancrage est
QGraphicsView.AnchorViewCenter, le point de la scène représenté au centre de
la vue reste au centre de la vue ; c'est ce que nous avons fait dans les exemples de
zoom au chapitre précédent. Ici, la valeur QGraphicsView.AnchorUnderMouse
impose que le point d'ancrage soit le point de la scène sous le pointeur souris.
L'utilisateur pourra ainsi facilement zoomer où bon lui semble.
La méthode wheelEvent est appelée à chaque mouvement de la molette (ou
240
Après avoir joué un peu avec l'application, on se rend compte qu'on atteint assez vite
les limites du système lorsque les carrés deviennent trop petits : le pointeur main
occulte les détails et on ne voit plus exactement sur quel carré on clique. Une fonction
zoom est donc ardemment requise.
On a vu au chapitre précédent comment commander le zoom via un widget curseur
(QSlider). Au niveau de l'ergonomie, ceci n'est clairement pas la technique la plus
adaptée, car on impose à l'utilisateur de déplacer le curseur souris sur un widget hors
de la scène. Au lieu de cela, nous allons programmer le zoom via la molette de la
souris et, en alternative, via le clavier. Dans les deux cas, on fera en sorte que le zoom
soit centré sur la position du pointeur souris, ce qui est la norme dans les applications
cartographiques.
Commençons par le zoom via la molette de la souris. Selon la philosophie du
framework, le seul point à modifier est l'implémentation de la vue, c'est-à-dire la
classe VueMosaiQ.
…
class VueMosaiQ(QGraphicsView):
def __init__(self,scene):
…
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
def wheelEvent(self,event): self.zoom(event.angleDelta().y()/100.0) def
zoom(self,facteur): if facteur < 0.0: facteur = -1.0 / facteur self.scale(facteur,facteur)
Cette instruction définit un point d'ancrage pour les transformations de la vue (le
zoom notamment), c'est-à-dire un point dont les coordonnées vue ne seront pas
affectées par la transformation. Par défaut, le point d'ancrage est
QGraphicsView.AnchorViewCenter, le point de la scène représenté au centre de
la vue reste au centre de la vue ; c'est ce que nous avons fait dans les exemples de
zoom au chapitre précédent. Ici, la valeur QGraphicsView.AnchorUnderMouse
impose que le point d'ancrage soit le point de la scène sous le pointeur souris.
L'utilisateur pourra ainsi facilement zoomer où bon lui semble.
La méthode wheelEvent est appelée à chaque mouvement de la molette (ou
240
