3. Fragmentation par clic
Nous voilà maintenant prêts à réaliser la fonction principale de l'application : un clic
sur le carré doit le fragmenter en quatre carrés plus petits. Réagir au clic sur le carré
est très simple : il suffit de surcharger la méthode mousePressEvent de la classe
CarreMosaiQ. Voici les deux méthodes à ajouter à cette classe :
…
class CarreMosaiQ(QGraphicsRectItem):
…
def mousePressEvent(self,mouseEvent):
if mouseEvent.button() == Qt.LeftButton:
self.fragmente() else: QGraphicsRectItem.mousePressEvent(self,mouseEvent)
def fragmente(self): c = self.rect().width() / 2 x = self.x() y = self.y() scene =
self.scene() scene.removeItem(self) for (dx,dy) in ((0,0),(c,0),(0,c),(c,c)):
scene.addItem(CarreMosaiQ(x+dx,y+dy,c))
La méthode mousePressEvent est invoquée quel que soit le bouton actionné. On
reçoit en argument un QGraphicsSceneMouseEvent, qui donne tous les détails sur
l'événement : bouton enfoncé, position sur la scène, etc. Pour se permettre
d'associer plus tard de nouvelles fonctions aux autres boutons, on fait un test pour ne
prendre en compte que les clics sur bouton gauche.
On factorise le traitement dans la méthode fragmente : on fait ainsi un découplage
entre événement et traitement, un peu comme avec les signaux et slots. Cela
facilitera l'ajout de nouvelles fonctions qui fragmentent le carré via d'autres actions.
Si le bouton cliqué n'est pas le bouton gauche, on fait le traitement par défaut de la
classe parente. Il est fort probable que cet appel ne fasse rien, mais il est de bonne
pratique, avec le patron de méthode, d'appeler la méthode parente comme traitement
par défaut.
La méthode fragmente a quatre nouveaux carrés à créer ; on calcule la taille de ces
carrés en divisant la taille du côté du carré pointé par deux.
237
Nous voilà maintenant prêts à réaliser la fonction principale de l'application : un clic
sur le carré doit le fragmenter en quatre carrés plus petits. Réagir au clic sur le carré
est très simple : il suffit de surcharger la méthode mousePressEvent de la classe
CarreMosaiQ. Voici les deux méthodes à ajouter à cette classe :
…
class CarreMosaiQ(QGraphicsRectItem):
…
def mousePressEvent(self,mouseEvent):
if mouseEvent.button() == Qt.LeftButton:
self.fragmente() else: QGraphicsRectItem.mousePressEvent(self,mouseEvent)
def fragmente(self): c = self.rect().width() / 2 x = self.x() y = self.y() scene =
self.scene() scene.removeItem(self) for (dx,dy) in ((0,0),(c,0),(0,c),(c,c)):
scene.addItem(CarreMosaiQ(x+dx,y+dy,c))
La méthode mousePressEvent est invoquée quel que soit le bouton actionné. On
reçoit en argument un QGraphicsSceneMouseEvent, qui donne tous les détails sur
l'événement : bouton enfoncé, position sur la scène, etc. Pour se permettre
d'associer plus tard de nouvelles fonctions aux autres boutons, on fait un test pour ne
prendre en compte que les clics sur bouton gauche.
On factorise le traitement dans la méthode fragmente : on fait ainsi un découplage
entre événement et traitement, un peu comme avec les signaux et slots. Cela
facilitera l'ajout de nouvelles fonctions qui fragmentent le carré via d'autres actions.
Si le bouton cliqué n'est pas le bouton gauche, on fait le traitement par défaut de la
classe parente. Il est fort probable que cet appel ne fasse rien, mais il est de bonne
pratique, avec le patron de méthode, d'appeler la méthode parente comme traitement
par défaut.
La méthode fragmente a quatre nouveaux carrés à créer ; on calcule la taille de ces
carrés en divisant la taille du côté du carré pointé par deux.
237
