警告:建议的解决方案不适用于多选项目。问题是,在这种情况下,只有一个项目会收到鼠标移动事件。
实际上,QGraphicsItem 上的 Qt 文档提供了一个示例,该示例正好解决了将项目移动限制到场景矩形的问题:
QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QRectF rect = scene()->sceneRect();
if (!rect.contains(newPos)) {
// Keep the item inside the scene rect.
newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
return newPos;
}
}
return QGraphicsItem::itemChange(change, value);
}
注意 I:您必须启用该QGraphicsItem::ItemSendsScenePositionChanges
标志:
item->setFlags(QGraphicsItem::ItemIsMovable
| QGraphicsItem::ItemIsSelectable
| QGraphicsItem::ItemSendsScenePositionChanges);
注意二:如果你只想对完成的动作做出反应,考虑使用GraphicsItemChange
标志ItemPositionHasChanged