警告:提案された解決策は、複数選択されたアイテムには機能しません。問題は、その場合、アイテムの 1 つだけがマウス移動イベントを受け取ることです。
実際、QGraphicsItem の Qt ドキュメントには、アイテムの移動をシーン rect に制限するという問題を正確に解決する例が示されています。
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);
注 II:終了した動きにのみ反応したい場合は、GraphicsItemChange
フラグの使用を検討してください。ItemPositionHasChanged