Search code examples
qtqgraphicsitemqgraphicsscene

Prevent QGraphicsItem from moving outside of QGraphicsScene


I have a scene which has fixed dimensions from (0;0) to (481;270):

scene->setSceneRect(0, 0, 481, 270);

Inside of it, I have a custom GraphicsItem and I can move it thanks to the flag ItemisMovable, but I would like it to stay within the Scene; I actually mean I don't want it to have coordinates neither under (0;0) nor over (481;270).

I tried several solutions like overriding QGraphicsItem::itemChange() or even QGraphicsItem::mouseMoveEvent() but I still cannot manage to reach what I want to do.

What is the suitable solution for my needs? Do I use QGraphicsItem::itemChange() badly?

Thanks in advance.


Solution

  • You can override QGraphicsItem::mouseMoveEvent() like this:

    YourItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
    {
        QGraphicsItem::mouseMoveEvent(event); // move the item...
    
        // ...then check the bounds
        if (x() < 0)
            setPos(0, y());
        else if (x() > 481)
            setPos(481, y());
    
        if (y() < 0)
            setPos(x(), 0);
        else if (y() > 270)
            setPos(x(), 270);
    }