[SOLVED] Restrict Movement Of GraphicsViewItem To certain area in scene
-
Take a look at QGraphicsItem::itemChange.
When you overload it, you can handle the case QGraphicsItem::ItemPositionChange, and override any position changes so they stay within the allowed area.This only works if the item itself is moved, not if any of it's parents is moved.
-
Take a look at QGraphicsItem::itemChange.
When you overload it, you can handle the case QGraphicsItem::ItemPositionChange, and override any position changes so they stay within the allowed area.This only works if the item itself is moved, not if any of it's parents is moved.
@Asperamanca
i came across this solution... logically this seems right...but its not making any diffrence...shouldnt it restrict the movement to one axis...wats the mistake...am i not set itemIsMovable flagQVariant MyItem::itemChange(GraphicsItemChange change, const QVariant &value) { if (change == ItemPositionChange) return QPointF(pos().x(), value.toPointF().y()); return QGraphicsItem::ItemChange(change, value); } -
First, I would make sure you actually get called. For performance reasons, many types of itemChange first have to be activated by setting flags.
For this change, you need to activate a flag: ItemSendsPositionChanges (see docs of ItemPositionChange). -
So I found solution which is easier to implement...
Instead of item change i overloaded QGraphicsItem::mouseMoveEvent(event)...
it restricts movement between x1 and x2... and it is restricted to x axis if i set diffrence between y1 and y2 equal to height of itemvoid ScheduleScroller::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mouseMoveEvent(event);if (x() < x1) { setPos(x1, y()); } else if (x() + boundingRect().right() > x2) { setPos(x2 - boundingRect().width(), y()); } if (y() < y1) { setPos(x(), y1); } else if ( y()+ boundingRect().bottom() > y2) { setPos(x(), y2 - boundingRect().height()); }}