用mouseMoveEvent约束QGraphicsItem移动

Constrain QGraphicsItem movement with mouseMoveEvent

本文关键字:移动 QGraphicsItem 约束 mouseMoveEvent      更新时间:2023-10-16

我正在尝试适当地约束QGraphicsItem(特别是QGraphicsRectItem)的移动,而不改变其原生行为作为x轴上的滚动条。

我尝试重写mouseMoveEvent函数,但随后我需要在X和Y方向上重写矩形的行为。充其量,我可以让矩形用鼠标捕捉到一个位置。(这里矩形将会卡住,因此鼠标将其保持在中点):

void SegmentItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
  setY(0);
  setX(event->scenePos().x() - boundingRect().width()/2);
}

我现在正在看itemChange,正如这里所描述的,但它看起来有点笨拙,并不完全优雅。编辑:这应该工作,但我目前不能强迫它工作。

是否有一种方法来约束y轴的运动?(我还需要为滚动条创建结束点,但稍后。)

我对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);
 }

回答你关于限制移动到一个方向的问题的另一部分…使用与上述答案相同的itemChange结构。您需要做的唯一额外的事情是在返回项目之前将项目的当前X或Y坐标转移到新位置。这一行允许Y跟踪鼠标,但保持X不变(即移动被限制为垂直):

newPos.setX (this->pos().x());

类似地,允许X跟踪鼠标,但保持Y不变(即移动限制为水平):

newPos.setY (this->pos().y());

使用ItemPositionChange通知,项的当前位置尚未改变,因此您可以在返回新值之前以任何方式操作新位置。