À présent, voici comment la molette (QDial nommée dialRotation) va faire tourner
la vue principale :
def __init__(self,parent=None):
…
self.angleVue = 0.0
…
@pyqtSlot(int)
def on_dialRotation_valueChanged(self,nouvelAngleVue):
self.vuePrincipale.rotate(nouvelAngleVue-self.angleVue)
self.angleVue = nouvelAngleVue
On a déjà vu précédemment la méthode rotate de QGraphicsView. Comme on a
configuré la molette dans Qt Designer pour donner des valeurs entre −180 et +180, on
peut directement interpréter cette valeur comme un angle de rotation. Comme on peut le
voir, il y a toutefois une petite astuce à comprendre : la méthode rotate est
cumulative, c'est-à-dire que l'angle passé en argument s'ajoute à l'angle de rotation
courant de la vue. On doit donc s'arranger pour donner un angle relatif (différence entre
le nouvel angle et l'angle courant). Comme QGraphicsView ne fournit pas une méthode
simple pour connaître son angle courant, on maintient sa valeur dans un attribut
angleVue initialisé à 0°.
Pour terminer notre codage, on implémente le traitement du curseur (QSlider nommé
horizontalSliderZoom) pour opérer les zooms :
def __init__(self,parent=None):
…
self.zoomPctVue = 1.0
self.horizontalSliderZoom.setValue(100)
…
@pyqtSlot(int)
def on_horizontalSliderZoom_valueChanged(self,nouvZoomPctVue):
f = (nouvZoomPctVue/100.0) / self.zoomPctVue
self.vuePrincipale.scale(f,f)
self.zoomPctVue = nouvZoomPctVue/100.0
Pour comprendre ces lignes, il faut se rappeler que la valeur passée par le curseur est
un nombre entier entre 10 et 1000, à interpréter comme un pourcentage (voir la
configuration de notre QSlider faite dans Qt Designer) ; il faut donc diviser cette valeur
par 100.0 pour obtenir le facteur exprimé en virgule flottante à passer à scale. Par
ailleurs, il faut ici aussi gérer les facteurs de zoom en relatif, car la méthode scale, à
l'instar de rotate, est cumulative. Ici, on travaille bien sûr par division et pas par
différence. L'instruction setValue dans le constructeur initialise les choses pour
garantir que la valeur initiale du curseur est synchronisée avec le facteur de zoom (ceci
n'était pas nécessaire avec la molette, initialisée à l'angle 0°).
223
Précédent

- 224/494

Suivant