设置我重写的QGraphicsRectItem不能移动超出scene场景
时间: 2024-03-27 20:35:58 浏览: 81
你可以通过重写QGraphicsRectItem的mouseMoveEvent()函数来实现,当鼠标移动超出场景时,将其限制在场景内。下面是一个示例:
```python
class MyRectItem(QGraphicsRectItem):
def __init__(self, parent=None):
super().__init__(parent)
self.setFlag(QGraphicsItem.ItemIsMovable, True) # 允许移动
def mouseMoveEvent(self, event):
# 获取当前场景的边界矩形
scene_rect = self.scene().sceneRect()
# 获取当前图形项的边界矩形
item_rect = self.boundingRect()
# 获取当前鼠标位置
pos = event.scenePos()
# 如果超出场景,则将其限制在场景内
if not scene_rect.contains(pos.x() - item_rect.width() / 2, pos.y() - item_rect.height() / 2,
item_rect.width(), item_rect.height()):
if pos.x() < scene_rect.left() + item_rect.width() / 2:
pos.setX(scene_rect.left() + item_rect.width() / 2)
elif pos.x() > scene_rect.right() - item_rect.width() / 2:
pos.setX(scene_rect.right() - item_rect.width() / 2)
if pos.y() < scene_rect.top() + item_rect.height() / 2:
pos.setY(scene_rect.top() + item_rect.height() / 2)
elif pos.y() > scene_rect.bottom() - item_rect.height() / 2:
pos.setY(scene_rect.bottom() - item_rect.height() / 2)
# 将图形项移动到限制后的位置
self.setPos(pos)
# 否则,调用父类中的mouseMoveEvent()函数
else:
super().mouseMoveEvent(event)
```
在这个示例中,我们首先允许图形项移动,然后重写mouseMoveEvent()函数。在该函数中,我们获取当前场景的边界矩形、当前图形项的边界矩形和鼠标位置,并检查是否超出场景。如果超出场景,则将其限制在场景内,并将图形项移动到限制后的位置。否则,我们调用父类中的mouseMoveEvent()函数,以便处理其他移动操作。
阅读全文