2014-03-19 4 views
1

제 질문은이 post과 비슷하지만 C++ 및 QGraphicsItem과 비슷하다고 생각합니다.Qt : 다른 QGraphicsItem 안에 QGraphicsItem의 움직일 수있는 영역을 제한하십시오. C++

내 QGraphicsItem 내에서 내 개체의 움직일 수있는 영역을 수정하고 싶습니다. 외부로 옮기려고하면 물건을 안에 머물러있게 해 줘.

아마 setParentItem()을 사용하는 것이 좋습니다.

누군가 QGraphicsItem 내부의 움직이는 영역을 제한하는 방법을 알고 있습니까?

답변

2

나는 내 문제를 해결했습니다!

이 내용을 추가하면 내 QGraphicsItem의 위치를 ​​설정하는 방법을 재정의 할 수 있습니다. 내 항목은이 같은 boundingRect()에 의해 정의된다

QRectF MyClass::boundingRect() const 
{ 
return QRectF(-_w/2, -_h/2, _w, _h); 
} 

그래서 나는이 QRectF 장면 내부에 유지하고 싶었다. 내 항목의 위치는 QRectF의 가운데에 의해 정의됩니다.
QVariant Aabb::itemChange(GraphicsItemChange change, const QVariant &value) 
{ 


if (change == ItemPositionChange && scene()) { 
    // value is the new position. 
    QPointF newPos = value.toPointF(); 
    QRectF rect = scene()->sceneRect(); 

    if (!rect.contains(newPos.x() - _w/2, newPos.y() -  _h/2)||!rect.contains(newPos.x() - _w/2, newPos.y() + _h/2)||!rect.contains(newPos.x() + _w/2, newPos.y() + _h/2)||!rect.contains(newPos.x() + _w/2, newPos.y() - _h/2)) 
    { 
     // Keep the item inside the scene rect. 
     newPos.setX(qMin(rect.right() - _w/2, qMax(newPos.x() , rect.left() + _w/2))); 
     newPos.setY(qMin(rect.bottom() - _h/2, qMax(newPos.y() , rect.top() + _h/2))); 
     return newPos; 
    } 


} 

return QGraphicsItem::itemChange(change, value); 
} 

가 (질문에 주석을 참조) 장면의 QRectF을 설정하는 것을 잊지 마세요 : 여기 @Salvatore Avanzo에 의해 제안 된 Qt는 문서의 코드를 사용 내 코드입니다.

+0

대단히 감사합니다.이 방법이 훨씬 효과적입니다. 실제로 나는 오른쪽과 아래쪽 영역에서 같은 문제가있었습니다. – danger89

4

예. 올바른 것입니다. here에서와 같이 itemChange를 다시 구현해야합니다. qt 설명서에서

여기서 scene()은 항목이있는 QGraphicsScene을 나타냅니다. QGraphicScene을 사용하지 않으면 QRectF를 적절히 설정해야합니다 (어쩌면 상위 항목 기하학에서).

+0

감사합니다. 나는 당신의 코드를 시험해 보았고 이것은 내 장면의 왼쪽과 오른쪽에있는 움직일 수있는'QGraphicsItem'에서 나의'QRectF'를 막고 있습니다. 나는 여전히 장면의 오른쪽과 아래에서 차단해야한다. (아마도 'boundingRect(). bottomRight()'를 사용하여 코드를 조정하면된다). 나는 너에게 알려주려고한다. – Jeanstackamort

+1

실제로 코드가 왼쪽 위 모서리의 오른쪽과 아래에서 작동하지 않는 이유를 모르겠습니다 ... – Jeanstackamort

+0

@ user2886875 : 사용하신 rect에 의존 할 수 있습니다. 실제 rect의 좌표를 디버그/인쇄해야합니다. –