1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsTextItem
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QPainter, QTransform
class MyItem(QGraphicsRectItem):
def __init__(self, x, y, width, height, text, color):
super().__init__(0, 0, width, height) # Taille relative au parent
self.setBrush(color)
# Ajouter un QGraphicsTextItem pour le texte modifiable
self.text_item = QGraphicsTextItem(text, self)
self.text_item.setTextInteractionFlags(Qt.NoTextInteraction) # Texte non modifiable par défaut
self.text_item.setPos(10, 10) # Position relative au rectangle
# Position globale du rectangle
self.setPos(x, y)
def enableTextEditing(self):
"""Activer l'édition du texte."""
print(f"activer")
self.text_item.setTextInteractionFlags(Qt.TextEditorInteraction)
self.text_item.setFocus()
def disableTextEditing(self):
"""Désactiver l'édition du texte et retirer la sélection."""
print(f"desactiver")
self.text_item.setTextInteractionFlags(Qt.NoTextInteraction)
# Retirer la sélection explicitement
self.text_item.setSelected(False) # Retirer la sélection
self.text_item.clearFocus() # Retirer le focus
class ParentItem(QGraphicsRectItem):
def __init__(self, x, y, width, height):
super().__init__(0, 0, width, height) # Taille relative à la scène
self.setBrush(Qt.lightGray) # Couleur du rectangle parent
# Créer deux rectangles enfants avec texte modifiable
self.rect1 = MyItem(10, 10, 200, 100, "Texte modifiable 1", Qt.green)
self.rect2 = MyItem(10, 120, 200, 100, "Texte modifiable 2", Qt.green)
# Définir les enfants comme éléments du parent
self.rect1.setParentItem(self)
self.rect2.setParentItem(self)
# Rendre le parent déplaçable
self.setFlag(QGraphicsRectItem.ItemIsMovable, True)
# Position globale du parent
self.setPos(x, y)
class CustomScene(QGraphicsScene):
def __init__(self):
super().__init__()
self.active_text_item = None
def mousePressEvent(self, event):
"""Gérer la sélection/désélection des textes et des éléments."""
# Vérifier si un texte a été cliqué
item = self.itemAt(event.scenePos(), QTransform())
if isinstance(item, QGraphicsTextItem):
parent = item.parentItem()
if isinstance(parent, MyItem):
# Activer l'édition pour le texte cliqué
if self.active_text_item:
self.active_text_item.disableTextEditing()
parent.enableTextEditing()
self.active_text_item = parent
return
# Désactiver l'édition du texte si on clique ailleurs
if self.active_text_item:
self.active_text_item.disableTextEditing()
self.active_text_item = None
super().mousePressEvent(event)
if __name__ == '__main__':
app = QApplication([])
# Créer une scène personnalisée
scene = CustomScene()
# Ajouter deux rectangles parents avec enfants
parent1 = ParentItem(50, 50, 300, 250) # Premier rectangle gris
parent2 = ParentItem(400, 50, 300, 250) # Deuxième rectangle gris
# Ajouter les rectangles parents à la scène
scene.addItem(parent1)
scene.addItem(parent2)
# Créer une vue pour afficher la scène
view = QGraphicsView(scene)
view.setRenderHint(QPainter.Antialiasing)
view.setRenderHint(QPainter.SmoothPixmapTransform)
view.show()
app.exec_() |
Partager