Prevent QGraphicsItem from moving outside of QGraphicsScene

前端 未结 3 1517
孤城傲影
孤城傲影 2021-02-07 18:20

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

3条回答
  •  失恋的感觉
    2021-02-07 18:49

    Warning: The suggested solutions won't work for multiply selected items. The problem is, only one of the items receives a mouse move event in that case.

    Actually, the Qt Documentation on QGraphicsItem provides an example which exactly solves the problem of limiting the movement of items to the scene 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);
    }
    

    Note I: You'd have to enable the QGraphicsItem::ItemSendsScenePositionChanges flag:

    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemSendsScenePositionChanges);
    

    Note II: If you only want to react on finished movement, consider using the GraphicsItemChange flag ItemPositionHasChanged

提交回复
热议问题