from PyQt5.QtWidgets import QApplication, QGraphicsScene,
QGraphicsView, \
QGraphicsItem, QGraphicsRectItem, QGraphicsTextItem,
QGraphicsEllipseItem
Commençons par ajouter un texte en bleu sur la scène, juste après la création du
rectangle gris (donc, au-dessus !) :
texte = QGraphicsTextItem("Tous en scène !")
dy = rectGris.sceneBoundingRect().height() -
texte.sceneBoundingRect().height()
texte.setPos(rectGris.x(),rectGris.y()+dy)
texte.setDefaultTextColor(QColor('blue')) scene.addItem(texte)
Pour rendre l'exemple instructif, on a choisi de placer ce texte juste en bas du rectangle
(voir Figure 11.2). Pour faire cela de manière générique, quelles que soient les
dimensions du rectangle et celles du texte, il y a un peu de calcul de coordonnées à
faire. Comme on n'a pas déclaré de parent pour le texte, il faut le positionner
directement dans le repère de la scène. Les coordonnées scène du coin supérieur du
rectangle sont connues : rectGris.pos(), ce qui revient à
(rectGris.x(),rectGris.y()). L'appel à setPos part de ce point et le décale de dy
vers le bas pour l'aligner avec le bas du rectangle . La valeur de dy est calculée par
soustraction de la hauteur du rectangle avec la hauteur du texte ; pour obtenir la
hauteur de chaque élément QGraphicsItem, on doit procéder en deux temps : on invoque
la méthode sceneBoundingRect() pour obtenir un rectangle (instance de QRectF), on
invoque ensuite height() pour en obtenir la hauteur.
1.3. Composition
Plaçons à présent un smiley, formé d'un cercle jaune et de deux ellipses pour les yeux
(on ne dessinera pas la bouche, qui est un élément un peu plus compliqué).
d = 48. # diametre smiley
ox = 4. # largeur oeil oy = 6. # hauteur oeil smiley = QGraphicsEllipseItem(-d/2,d/2,d,d) smiley.setBrush(QBrush(Qt.yellow)) yeux = [QGraphicsEllipseItem(-ox/2.,oy/2.,ox,oy,parent=smiley) \ for _ in range(2)] yeux[0].setPos(-d/6,-d/8)
yeux[1].setPos(+d/6,-d/8) brush = QBrush(Qt.black) for oeil in yeux:
oeil.setBrush(brush) smiley.setPos(rectGris.mapToScene(rectGris.rect().center()))
scene.addItem(smiley)
203
QGraphicsView, \
QGraphicsItem, QGraphicsRectItem, QGraphicsTextItem,
QGraphicsEllipseItem
Commençons par ajouter un texte en bleu sur la scène, juste après la création du
rectangle gris (donc, au-dessus !) :
texte = QGraphicsTextItem("Tous en scène !")
dy = rectGris.sceneBoundingRect().height() -
texte.sceneBoundingRect().height()
texte.setPos(rectGris.x(),rectGris.y()+dy)
texte.setDefaultTextColor(QColor('blue')) scene.addItem(texte)
Pour rendre l'exemple instructif, on a choisi de placer ce texte juste en bas du rectangle
(voir Figure 11.2). Pour faire cela de manière générique, quelles que soient les
dimensions du rectangle et celles du texte, il y a un peu de calcul de coordonnées à
faire. Comme on n'a pas déclaré de parent pour le texte, il faut le positionner
directement dans le repère de la scène. Les coordonnées scène du coin supérieur du
rectangle sont connues : rectGris.pos(), ce qui revient à
(rectGris.x(),rectGris.y()). L'appel à setPos part de ce point et le décale de dy
vers le bas pour l'aligner avec le bas du rectangle . La valeur de dy est calculée par
soustraction de la hauteur du rectangle avec la hauteur du texte ; pour obtenir la
hauteur de chaque élément QGraphicsItem, on doit procéder en deux temps : on invoque
la méthode sceneBoundingRect() pour obtenir un rectangle (instance de QRectF), on
invoque ensuite height() pour en obtenir la hauteur.
1.3. Composition
Plaçons à présent un smiley, formé d'un cercle jaune et de deux ellipses pour les yeux
(on ne dessinera pas la bouche, qui est un élément un peu plus compliqué).
d = 48. # diametre smiley
ox = 4. # largeur oeil oy = 6. # hauteur oeil smiley = QGraphicsEllipseItem(-d/2,d/2,d,d) smiley.setBrush(QBrush(Qt.yellow)) yeux = [QGraphicsEllipseItem(-ox/2.,oy/2.,ox,oy,parent=smiley) \ for _ in range(2)] yeux[0].setPos(-d/6,-d/8)
yeux[1].setPos(+d/6,-d/8) brush = QBrush(Qt.black) for oeil in yeux:
oeil.setBrush(brush) smiley.setPos(rectGris.mapToScene(rectGris.rect().center()))
scene.addItem(smiley)
203
