Я делаю приложение, в котором пользователь может рисовать прямоугольники, круги и многоугольники на сцене.Затем эти элементы можно выбирать, удалять, перемещать и т. Д. В приведенном ниже коде показано, что я сделал для достижения этой цели:
class Rectangle(QGraphicsRectItem):
def __init__(self, x, y, w, h):
super(Rectangle, self).__init__(0, 0, w, h)
super().setPen(QPen(Qt.red, 2))
super().setFlag(QGraphicsItem.ItemIsSelectable)
super().setFlag(QGraphicsItem.ItemIsMovable)
super().setFlag(QGraphicsItem.ItemIsFocusable)
super().setFlag(QGraphicsItem.ItemSendsGeometryChanges)
super().setFlag(QGraphicsItem.ItemSendsScenePositionChanges)
super().setPos(QPointF(x, y))
def mouseMoveEvent(self, e):
x = e.pos().x()
y = e.pos().y()
if e.buttons() == Qt.LeftButton:
super().mouseMoveEvent(e)
if e.buttons() == Qt.RightButton:
super().setRect(QRectF(0, 0, x, y))
def itemChange(self, change, val):
if change == QGraphicsItem.ItemPositionChange:
return QPointF(val.x(), val.y())
return val
Рабочий код для круга:
class Circle(QGraphicsEllipseItem):
def __init__(self, x, y, w, h):
super(Circle, self).__init__(0, 0, w, h)
super().setPen(QPen(Qt.darkBlue, 2))
super().setFlag(QGraphicsItem.ItemIsSelectable)
super().setFlag(QGraphicsItem.ItemIsMovable)
super().setFlag(QGraphicsItem.ItemIsFocusable)
super().setFlag(QGraphicsItem.ItemSendsGeometryChanges)
super().setFlag(QGraphicsItem.ItemSendsScenePositionChanges)
super().setPos(QPointF(x - w / 2 - 4, y - h / 2 - 4))
def mouseMoveEvent(self, e):
x = e.pos().x()
y = e.pos().y()
print(x, y)
if e.buttons() == Qt.LeftButton:
super().mouseMoveEvent(e)
if e.buttons() == Qt.RightButton:
super().setRect(QRectF(0, 0, x, y))
def itemChange(self, change, val):
if change == QGraphicsItem.ItemPositionChange:
return QPointF(val.x(), val.y())
return val
У меня эллипс имеет точно такой же код.Когда я изменю размер эллипса «отрицательно», то есть выше верхней левой точки, он будет соответственно изменен.Однако прямоугольник просто исчезает, он может оставить небольшой след красного цвета, но он просто не рисует так, как должен.Почему это отличается для прямоугольника?Как я могу решить эту проблему?
Большинство решений, которые я вижу по переполнению стека, кажутся излишними и слишком много кода для небольшой реализации.