Qt: ограничить подвижную область QGraphicsItem внутри другого QGraphicsItem C++

Я думаю, что мой вопрос похож на этот пост, но в C++ и внутри QGraphicsItem.

Я хотел бы исправить подвижную область моего объекта внутри другого QGraphicsItem. Я хочу, чтобы мой объект оставался внутри, если я попытаюсь переместить его наружу.

Может быть, идея будет использовать setParentItem(),

Кто-нибудь знает, как ограничить подвижную область внутри QGraphicsItem, пожалуйста?

2 ответа

Решение

Я решил свою проблему!

Для этого я добавлю переопределить, как установить положение моего QGraphicsItem, Мой предмет просто определяется по boundingRect() как это:

QRectF MyClass::boundingRect() const
{
return QRectF( -_w/2, -_h/2, _w, _h);
}

Итак, я хотел этого QRectF оставаться внутри сцены. Положение моего предмета определяется центром этого QRectF, Используя код из документации Qt, предложенной @Salvatore Avanzo, вот мой код:

QVariant Aabb::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.x() - _w/2, newPos.y() -     _h/2)||!rect.contains(newPos.x() - _w/2, newPos.y() + _h/2)||!rect.contains(newPos.x() + _w/2, newPos.y() + _h/2)||!rect.contains(newPos.x() + _w/2, newPos.y() - _h/2)) 
    {
        // Keep the item inside the scene rect.
        newPos.setX(qMin(rect.right() - _w/2, qMax(newPos.x() , rect.left() + _w/2)));
        newPos.setY(qMin(rect.bottom() - _h/2, qMax(newPos.y() , rect.top() + _h/2)));
        return newPos;
    }


}

return QGraphicsItem::itemChange(change, value);
}

Не забудьте установить QRectF сцены (см. комментарии в вопросе).

Да вы правы. Как и здесь, вы должны переопределить itemChange. Из документации 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);
}

где scene() ссылается на QGraphicsScene, в котором находится элемент. Если вы не используете QGraphicScene, вы должны установить QRectF соответствующим образом (возможно, из геометрии родительского элемента).

Другие вопросы по тегам