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