我认为我的问题类似于post,但在C ++和QGraphicsItem中。
我想将我的对象的可移动区域固定在另一个QGraphicsItem中。如果我试图将它移到外面,我希望我的物体留在里面。
也许这个想法是使用setParentItem()
。
有人知道如何限制QGraphicsItem内的可移动区域吗?
答案 0 :(得分:5)
是的,你是对的。与在here中一样,您必须重新实现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(可能来自父项几何)。
答案 1 :(得分:3)
我解决了我的问题!
为此我添加重新定义如何设置QGraphicsItem
的位置。我的项目只是由boundingRect()
定义,如下所示:
QRectF MyClass::boundingRect() const
{
return QRectF( -_w/2, -_h/2, _w, _h);
}
所以我希望这个QRectF
留在场景中。
我的项目的位置由此QRectF
的中心定义。
使用@Salvatore Avanzo提出的Qt文档中的代码是我的代码:
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
(请参阅问题中的注释)。