Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Constrain QGraphicsItem movement with mouseMoveEvent

I am attempting to properly constrain the movement of a QGraphicsItem (specifically QGraphicsRectItem) without changing the native behavior to function as a scrollbar on the X-axis.

I tried overriding the mouseMoveEvent function, but then I need to re-write the behavior for the rectangle in both the X and Y directions. At best, I can get the rectangle to snap to a single position with the mouse. (Here the rectangle will snap so the mouse holds it at the midpoint):

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

I'm looking at itemChange right now, as described here, but it looks a little unwieldy and not exactly elegant. EDIT: This should work, but I currently cannot coerce it to work.

Is there a way to just constrain the y-axis movement? (I will also need to create endstops for the scrollbar, but later.)

like image 610
Graeme Rock Avatar asked Dec 19 '25 14:12

Graeme Rock


1 Answers

I tinkered with the code from the itemChange Class Reference Page, and enhanced it so all four corners of my QGraphicsRectItem would stay within the 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);
 }
like image 166
Graeme Rock Avatar answered Dec 22 '25 05:12

Graeme Rock



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!