from PyQt5.QtWidgets import QGraphicsRectItem,QGraphicsItem, QGraphicsProxyWidget, QTableWidget, QTextEdit from PyQt5.QtCore import QRectF, pyqtSignal, Qt from custom_table_widget import CustomTableWidget, CustomTableWidget2x2 from globals import focusLock class GraphicsRectItemWithTable(QGraphicsRectItem): def __init__(self): super().__init__() self.setRect(0, 0, 300, 100) # Taille du rectangle self.setBrush(Qt.lightGray) # Couleur de fond self.setFlag(QGraphicsRectItem.ItemIsSelectable) self.setFlag(QGraphicsRectItem.ItemIsMovable) self.setFlag(QGraphicsItem.ItemIsFocusable, True) # Ajouter un tableau dans le rectangle self.table_widget = CustomTableWidget() self.table_widget.setEditTriggers(QTableWidget.AllEditTriggers) self.table_widget.setFocusPolicy(Qt.StrongFocus) self.proxy_widget = QGraphicsProxyWidget(self) self.proxy_widget.setWidget(self.table_widget) # Placer le tableau dans le rectangle self.proxy_widget.setGeometry(QRectF(1, 1, 298, 98)) self.table_widget.adjust_table_sizes() self.updateRectangleSize() self.table_widget.sizeChanged.connect(self.updateRectangleSize) def updateRectangleSize(self): table_size = self.table_widget.getTableSize() self.setRect(0, 0, table_size[0] + 10, table_size[1] + 10) # Ajuste le rectangle self.proxy_widget.setGeometry(QRectF(5, 5, table_size[0], table_size[1])) def setTextEditable(self, editable: bool): """Permet de rendre l'édition de texte activée ou désactivée""" print(f"Set text editable table: {editable}") if isinstance(self.table_widget, QTableWidget): for row in range(self.table_widget.rowCount()): for col in range(self.table_widget.columnCount()): item = self.table_widget.item(row, col) if item: item.setFlags(item.flags() | Qt.ItemIsEditable if editable else ~Qt.ItemIsEditable) def focusInEvent(self, event): self.focusLock = True print("Focus reçu par le groupe") if hasattr(self, 'childWidget'): if not self.childWidget.hasFocus(): self.childWidget.setFocus() super().focusInEvent(event) self.focusLock = False def focusOutEvent(self, event): if hasattr(self, 'childWidget') and self.childWidget.hasFocus(): print("Focus perdu mais l'enfant garde le focus") return print("Focus perdu par le groupe") super().focusOutEvent(event) def handleTableFocusOut(self): """Désélectionne la cellule lorsque le focus est perdu sur le tableau.""" print("Table Focus Out") current_cell = self.table_widget.currentItem() if current_cell: self.table_widget.setItemSelected(current_cell,False) self.table_widget.clearSelection() def mouseDoubleClickEvent(self, event): """Active l'édition sur double-clic.""" item = self.table_widget.itemAt(event.pos().x(), event.pos().y()) if item: self.table_widget.editItem(item) def keyPressEvent(self, event): print(f"Touche pressée : {event.key()}") if event.key() in {Qt.Key_Backspace, Qt.Key_Delete, Qt.Key_Enter, Qt.Key_Return, Qt.Key_Tab} or event.text(): # Passe l'événement au gestionnaire par défaut (par exemple, pour éditer du texte) super().keyPressEvent(event) else: event.ignore() def startEditing(self, row, column): if isinstance(self.widget, QTableWidget): self.widget.setCurrentCell(row, column) self.widget.editItem(self.widget.item(row, column)) class GraphicsRectItemWithTable2x2(QGraphicsRectItem): def __init__(self): super().__init__() self.setRect(0, 0, 300, 100) # Taille du rectangle self.setBrush(Qt.lightGray) # Couleur de fond self.setFlag(QGraphicsRectItem.ItemIsSelectable) self.setFlag(QGraphicsRectItem.ItemIsMovable) self.setFlag(QGraphicsItem.ItemIsFocusable, True) # Ajouter un tableau dans le rectangle self.table_widget = CustomTableWidget2x2() self.table_widget.setEditTriggers(QTableWidget.AllEditTriggers) self.table_widget.setFocusPolicy(Qt.StrongFocus) self.proxy_widget = QGraphicsProxyWidget(self) self.proxy_widget.setWidget(self.table_widget) # Placer le tableau dans le rectangle self.proxy_widget.setGeometry(QRectF(1, 1, 298, 98)) self.table_widget.adjust_table_sizes() self.updateRectangleSize() self.table_widget.sizeChanged.connect(self.updateRectangleSize) def updateRectangleSize(self): table_size = self.table_widget.getTableSize() self.setRect(0, 0, table_size[0] + 10, table_size[1] + 10) # Ajuste le rectangle self.proxy_widget.setGeometry(QRectF(5, 5, table_size[0], table_size[1])) def setTextEditable(self, editable: bool): """Permet de rendre l'édition de texte activée ou désactivée""" print(f"Set text editable table: {editable}") if isinstance(self.table_widget, QTableWidget): for row in range(self.table_widget.rowCount()): for col in range(self.table_widget.columnCount()): item = self.table_widget.item(row, col) if item: item.setFlags(item.flags() | Qt.ItemIsEditable if editable else ~Qt.ItemIsEditable) def focusInEvent(self, event): self.focusLock = True print("Focus reçu par le groupe") if hasattr(self, 'childWidget'): if not self.childWidget.hasFocus(): self.childWidget.setFocus() super().focusInEvent(event) self.focusLock = False def focusOutEvent(self, event): if hasattr(self, 'childWidget') and self.childWidget.hasFocus(): print("Focus perdu mais l'enfant garde le focus") return print("Focus perdu par le groupe") super().focusOutEvent(event) def handleTableFocusOut(self): """Désélectionne la cellule lorsque le focus est perdu sur le tableau.""" print("Table 2*2 Focus Out ") current_cell = self.table_widget.currentItem() if current_cell: self.table_widget.setItemSelected(current_cell, False) self.table_widget.clearSelection() def mouseDoubleClickEvent(self, event): """Active l'édition sur double-clic.""" item = self.table_widget.itemAt(event.pos().x(), event.pos().y()) if item: self.table_widget.editItem(item) def keyPressEvent(self, event): print(f"Touche pressée : {event.key()}") if event.key() in {Qt.Key_Backspace, Qt.Key_Delete, Qt.Key_Enter, Qt.Key_Return, Qt.Key_Tab} or event.text(): # Passe l'événement au gestionnaire par défaut (par exemple, pour éditer du texte) super().keyPressEvent(event) else: event.ignore() def startEditing(self, row, column): if isinstance(self.widget, QTableWidget): self.widget.setCurrentCell(row, column) self.widget.editItem(self.widget.item(row, column))