2016-10-24 4 views
2

X 축의 스크롤 막대처럼 작동하도록 기본 동작을 변경하지 않고 QGraphicsItem (특히 QGraphicsRectItem)의 움직임을 올바르게 제한하려고합니다.mouseMoveEvent를 사용하여 QGraphicsItem 이동을 제한합니다.

mouseMoveEvent 함수를 재정의하려했지만 X 및 Y 방향 모두에서 사각형의 동작을 다시 작성해야합니다. 기껏해야 사각형을 마우스로 단일 위치에 스냅 할 수 있습니다. 내가 지금 itemChange 찾고 있어요

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

here 설명 된대로,하지만 정확히 우아한 조금 다루기가 아닌 외모 : (여기에 사각형 그래서 마우스가 중간에 그것을 보유하고 스냅됩니다). 편집 :이 작동해야하지만 현재 작동하도록 강제 수 없습니다.

y 축 이동을 제한하는 방법이 있습니까? (나는 나중에 스크롤에 대한 endstops을 만들 수 있지만 필요가있을 것이다.) 나는 itemChange 클래스 참조 페이지에서 코드를 만지작 거렸다, 그래서 내 QGraphicsRectItem의 네 모서리가 QGraphicsScene 내에서 머물 것을 강화

+1

변경된 솔루션은 솔루션이며, 실제로는 매우 우아합니다. – Fabio

+0

쿨하지만 현재 어떤 것도 제한하지 않는 것 같습니다. 읽은 _ _ "기본 구현은 아무 것도하지 않고 값을 반환합니다."[클래스 참조 페이지] (http://doc.qt.io/qt-4.8/qgraphicsitem.html#itemChange) 내가 필요한 것을 알고 있습니까? 바꾸다? –

답변

1

:

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

운동의 한 방향으로 제한하는 것과 관련하여 질문의 다른 부분에 대답하려면 ... 위의 대답에 표시된 것과 동일한 itemChange 구조를 사용하십시오. 추가적으로 필요한 것은 아이템을 반환하기 전에 아이템의 현재 X 또는 Y 좌표를 새 위치로 옮기는 것입니다. 이 줄은 X를 마우스를 추적하는 Y를 수 있지만 계속 같은 (즉, 운동은 수직으로 제한됩니다) :

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

마찬가지로, X 마우스를 추적하지만, Y에게 동일하게 유지 할 수 있도록 (즉, 움직임이 제한된다) 수평으로 : 당신이 새로운 위치를 새 값을 반환하기 전에 원하는 방식으로 조작 할 수 있도록 ItemPositionChange 통지와

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

항목의 현재 위치는 아직 변경되지 않았습니다.

+0

쿨, 그게 너무 쉽게! –

관련 문제