我试图适当地限制QGraphicsItem(特别是QGraphicsRectItem)的移动,而无需更改本机行为以充当X轴上的滚动条。

我尝试覆盖mouseMoveEvent函数,但是随后我需要在X和Y方向上重新编写矩形的行为。充其量,我可以用鼠标将矩形捕捉到单个位置。 (此处矩形将对齐,因此鼠标将其保持在中点):

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

正如here所述,我现在正在查看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);
 }

10-06 07:23