from PyQt5.QtWidgets import ( QApplication, QGraphicsPolygonItem, QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsEllipseItem, QGraphicsRectItem, QGraphicsTextItem, QVBoxLayout, QPushButton, QHBoxLayout, QWidget, QFileDialog, QGraphicsLineItem, QGraphicsItemGroup, QGraphicsItem , QTextEdit,QGraphicsProxyWidget ) from PyQt5.QtGui import (QPen, QBrush, QColor, QPainter, QImage, QPolygonF ,QFontMetrics , QTextOption,QFont,QTransform ) from PyQt5.QtCore import Qt, QPointF, QLineF class DraggableDiamond(QGraphicsPolygonItem): def __init__(self, x, y, w, h , text,parent=None): super().__init__(parent) # self.polygon , self.base_width = w self.base_height = h self.text = text self.updatePolygon() self.setFlags( QGraphicsPolygonItem.ItemIsSelectable | QGraphicsPolygonItem.ItemIsMovable ) self.setBrush(QBrush(QColor(200, 200, 255))) self.setPen(QPen(Qt.black)) self.text_item = QGraphicsTextItem(self.text,self) self.text_item.setTextInteractionFlags(Qt.TextEditorInteraction) self.text_item.setTextWidth(self.base_width-20) self.text_item.setDefaultTextColor(QColor(0,0,0)) self.text_item.document().contentsChanged.connect(self.updateSizeBasedOnText) # Désactiver les barres de défilement self.updateSizeBasedOnText() # Positionner l'élément au début de la scène self.setPos(x, y) def updatePolygon(self): """ Met à jour la géométrie du losange en fonction de la largeur et de la hauteur actuelles. """ self.polygon = QPolygonF([ QPointF(0, -self.base_height / 2), QPointF(self.base_width / 2, 0), QPointF(0, self.base_height / 2), QPointF(-self.base_width / 2, 0) ]) self.setPolygon(self.polygon) def boundingRect(self): # Retourner un rectangle englobant pour les calculs de rendu diamond_rect = self.polygon.boundingRect() text_rect = self.text_item.boundingRect() # Obtenir la taille du proxy widget (QTextEdit) return diamond_rect.united(text_rect).adjusted(-10, -10, 10, 10) def updateSizeBasedOnText(self): """ Met à jour la taille du losange en fonction du texte contenu dans le QTextEdit. """ font= self.text_item.font() # Calculer la taille du texte en utilisant QFontMetrics fm = QFontMetrics(font) text_width = fm.horizontalAdvance(self.text_item.toPlainText()) text_height = fm.height() margin_width = 20#int(self.base_width * 0.2) margin_height = 20#int(self.base_height * 0.2) self.base_width= max(self.base_width,text_width+margin_width) self.base_height= max(self.base_height,text_height+margin_height) self.updatePolygon() text_rect = self.text_item.boundingRect() x_offset = -text_rect.width() / 2 y_offset = -text_rect.height() / 2 self.text_item.setPos(x_offset,y_offset) def itemChange(self, change, value): if change == QGraphicsPolygonItem.ItemPositionChange: new_pos =value self.proxy_widget.setPos(new_pos - self.proxy_widget.boundingRect().center()) return super().itemChange(change, value)