You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.2 KiB

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()