【发布时间】:2021-09-27 15:52:44
【问题描述】:
我有一个可移动的 QGraphicsRectItem,它旋转 90 度并设置为场景。当我拖动项目时,它会随机移动并最终消失。
但是,当我将旋转设置为 0 时,项目会完美移动。
这是我的最小可重现示例。
class main_window(QWidget):
def __init__(self):
super().__init__()
self.rect = Rectangle(100, 100, 100, 100)
self.rect.setRotation(90)
self.view = QGraphicsView(self)
self.scene = QGraphicsScene(self.view)
self.scene.addItem(self.rect)
self.view.setSceneRect(0, 0, 500,500)
self.view.setScene(self.scene)
self.slider = QSlider(QtCore.Qt.Horizontal)
self.slider.setMinimum(0)
self.slider.setMaximum(90)
vbox = QVBoxLayout(self)
vbox.addWidget(self.view)
vbox.addWidget(self.slider)
self.setLayout(vbox)
self.slider.valueChanged.connect(self.rotate)
def rotate(self, value):
self.angle = int(value)
self.rect.setRotation(self.angle)
class Rectangle(QGraphicsRectItem):
def __init__(self, *args):
super().__init__(*args)
self.setFlag(QGraphicsItem.ItemIsMovable, True)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges, True)
self.setPen(QPen(QBrush(QtGui.QColor('red')), 5))
self.selected_edge = None
self.first_pos = None
self.click_rect = None
def mousePressEvent(self, event):
self.first_pos = event.pos()
self.rect_shape = self.rect()
self.click_rect = self.rect_shape
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
# Calculate how much the mouse has moved since the click.
self.pos = event.pos()
x_diff = self.pos.x() - self.first_pos.x()
y_diff = self.pos.y() - self.first_pos.y()
# Start with the rectangle as it was when clicked.
self.rect_shape = QtCore.QRectF(self.click_rect)
self.rect_shape.translate(x_diff, y_diff)
self.setRect(self.rect_shape)
self.setTransformOriginPoint(self.rect_shape.center())
(我在主窗口的底部添加了一个滑块以方便地旋转项目)
为什么会这样?
【问题讨论】:
-
你正在设置
ItemIsMovable标志,在鼠标事件中实现移动是没有用的:尝试评论这两个函数,你会看到。 -
嗨@musicamante,您的解决方案效果很好。但是,如果我评论
ItemIsMovable标志并继续实现鼠标事件,问题仍然存在。我发现在仍然使用鼠标事件的同时评论self.setTransformOriginPoint(self.rect_shape.center())也解决了这个问题。这意味着setTransformOriginPoint使项目在拖动时随机移动。你知道为什么吗? -
事实上,您仍在使用定位在某个点的 QGraphicsRectItem,但有一个坐标不同的矩形(请记住,QGraphics 形状项目的形状位于 relative i> 到他们的位置)。这会产生一个非常复杂的转换问题:鼠标位置(基于 integer 值)由旋转(改为使用浮点)转换,然后由于浮点精度和整数转换,一定的旋转量显示了一些限制。我相信您需要更复杂的实现。
-
有什么变通办法让它工作吗?
-
没有“解决方法”,您需要以不同的方式实现该类:尝试“保持简单”并使用解决方法只会导致在您进一步实现的某个时刻出现另一个问题。我想你的图像选择/裁剪程序仍然需要这个,对吧?
标签: python pyqt pyside qgraphicsscene qgraphicsrectitem