from PySide6.QtCore import Qt, QObject, Signal from PySide6.QtGui import QPen, QBrush, QColor from PySide6.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsEllipseItem, QGraphicsLineItem class CustomEllipseItem(QGraphicsEllipseItem, QObject): clicked = Signal() def __init__(self, x, y, width, height, pen_circle, brush_circle, parent=None): super().__init__(0, 0, width, height, parent) QObject.__init__(self) self.setPen(pen_circle) self.setBrush(brush_circle) self.setPos(x - 50, y - 50) self.setFlag(QGraphicsEllipseItem.ItemIsMovable, True) self.setFlag(QGraphicsEllipseItem.ItemIsSelectable, True) def mousePressEvent(self, event): super().mousePressEvent(event) self.clicked.emit() class GraphicsDrawer(QGraphicsView): def __init__(self, graphics_view): super().__init__() self.graphics_view = graphics_view self.scene = QGraphicsScene() self.graphics_view.setScene(self.scene) pen_circle = QPen(Qt.red) pen_circle.setWidth(2) brush_circle = QBrush(QColor(255, 0, 0, 100)) circle_item1 = CustomEllipseItem(0, 0, 100, 100, pen_circle, brush_circle) circle_item2 = CustomEllipseItem(150, 0, 100, 100, pen_circle, brush_circle) self.scene.addItem(circle_item1) self.scene.addItem(circle_item2) circle_item1.clicked.connect(lambda: self.handle_click(circle_item1, circle_item2)) circle_item2.clicked.connect(lambda: self.handle_release(circle_item1, circle_item2)) def handle_click(self, item_pressed, item_released): print(f"{item_pressed} pressed") def handle_release(self, item_pressed, item_released): print(f"{item_released} released") self.create_connection(item_pressed, item_released) def create_connection(self, item_pressed, item_released): pen_line = QPen(Qt.green) pen_line.setWidth(2) line_item = QGraphicsLineItem(item_pressed.pos().x() + 50, item_pressed.pos().y() + 50, item_released.pos().x() + 50, item_released.pos().y() + 50) line_item.setPen(pen_line) self.scene.addItem(line_item) if __name__ == "__main__": app = QApplication([]) view = QGraphicsView() drawer = GraphicsDrawer(view) view.show() app.exec()