我正在尝试正确约束QGraphicsItem
(特别是QGraphicsRectItem
)的移动,而不会更改本机行为以充当X轴上的滚动条。
我尝试覆盖mouseMoveEvent
函数,但后来我需要在X和Y方向上重写矩形的行为。充其量,我可以使用鼠标将矩形捕捉到单个位置。 (这里矩形将捕捉,因此鼠标将其保持在中点):
void SegmentItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
setY(0);
setX(event->scenePos().x() - boundingRect().width()/2);
}
我现在正在itemChange
看here,但它看起来有点笨拙且不太优雅。
编辑:这应该有效,但我目前无法强迫它发挥作用。
有没有办法限制y轴运动? (我还需要为滚动条创建endstops,但稍后。)
答案 0 :(得分:1)
我修改了itemChange
类参考页面中的代码,并对其进行了增强,以便QGraphicsRectItem
的所有四个角都保持在QGraphicsScene
内:
QVariant SegmentItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QRectF rect = scene()->sceneRect();
rect.setWidth(rect.width() - boundingRect().width());
rect.setHeight(0);
if (!rect.contains(newPos)) {
// Keep the item inside the scene rect.
newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
newPos.setY(2);
return newPos;
}
}
return QGraphicsItem::itemChange(change, value);
}
答案 1 :(得分:1)
要回答关于将移动限制在一个方向的问题的其他部分...使用与上述答案中列出的相同的itemChange结构。您需要做的唯一事情是将项目的当前X或Y坐标转移到新位置,然后再返回。该行允许Y跟踪鼠标,但保持X相同(即移动限制为垂直):
newPos.setX (this->pos().x());
同样,允许X跟踪鼠标,但保持Y相同(即移动限制为水平):
newPos.setY (this->pos().y());
使用ItemPositionChange通知,项目的当前位置尚未更改,因此您可以在返回新值之前以任何方式操纵新位置。