2013-05-04 1 views
3

QGraphicsWidget에서 마우스 드래깅을 구현하는 방법은 무엇입니까? QGraphicsWidget의 마우스 드래그.

나는

setFlag(QGraphicsItem::ItemIsMovable); 

과 노력 그리고 언제 작동 (?) 예를 들어

enter image description here

, 노드 6 나는 마우스를 이동할 수 있지만, 노드의 나머지는 이동 실 거예요.

또한 노드를 이동할 때 그 노드에 연결된 가장자리를 이동하면 어떻게 구현할 수 있습니까?

답변

0

setFlag (QGraphicsItem :: ItemIsMovable)는 마우스로 드래그 가능한 QGraphicsItem을 만들기 위해 필요한 모든 것이어야합니다. 코드를 검사하여 실수로 다른 개체의 어딘가에 플래그를 설정하지 않았는지 확인할 수 있습니다. (QGraphicsEllipseItem과 같은 제공된 하위 클래스가 아닌 QGraphicsItem에서 직접 서브 클래 싱하는 경우 contains() 및 boundingRect() 메서드가 올바른 결과를 반환하는지 확인하십시오.

첨부 된 가장자리를 노드, 당신은 자신의 코드에서 그렇게 할 필요가 있다고 생각합니다. 특히 하나 이상의 edge 객체가 연결된 노드에서 setFlag (QGraphicsItem :: ItemSendsScenePositionChanges)를 호출합니다. 그런 다음 노드를 구현하는 QGraphicsItem 서브 클래스에서 QVariant itemChange(GraphicsItemChange, const QVariant &) 메소드를 대체하십시오. 해당 메소드를 구현할 때 첫 번째 인수의 값이 QGraphicsItem :: ItemScenePositionHasChanged와 같은지 살펴보고, 일치하는 경우 해당 엔드 포인트가 노드의 새 위치로 이동하도록 연관된 에지 객체를 업데이트하십시오.

+0

하지만 QGraphicsItem, QGraphicsWidget은 아닙니다. QGraphicsItem을 하위 클래스로 만들면 모든 작품이 문제가되지만 내 장면에 애니메이션을 적용해야하며 QPropertyAnimation – Steva

+0

으로 애니메이션 할 수있는 속성이 있으므로 해당 QGraphicsWidgets가 필요합니다. 귀하의 QGraphicsWidget 하위 클래스가 mousePressEvent() 또는 mouseMoveEvent() 또는 이와 비슷한 것을 대체합니까? 그렇다면 그 재 구현을 검사하여 마우스 이벤트 처리에 어떤 영향을 주 었는지 확인할 수 있습니다 (예 : 특정 경우에만 수퍼 클래스를 호출하는지, e-> accept() 또는 e-> ignore) 어떤 경우에만?) 그렇다면 끌기가 특정 경우에만 작동하는 이유를 설명 할 수 있습니다. –

+0

그럴 수 있습니다. 마우스 오른쪽 버튼을 클릭하면 팝업 메뉴에 mousePressEvent가 다시 구현됩니다. 하지만 다시 구현하지 않고 노력했지만 여전히 문제가 있습니다. 그러나 가장자리가없는 노드가 있으면 제대로 작동하지만 에지가 있으면 작동하지 않습니다.가장자리는 QGraphicsWIdget을 상속하는 또 다른 객체이며, 노드 독립적으로 그립니다 (먼저 i 가장자리를 그린 다음 노드). – Steva

1

실제 이유는 shape() 기능의 재정의를 제공하지 않았기 때문일 수 있습니다. 이 함수는 클릭 할 수있는 객체의 부분 인 "충돌"형상을 정의하는 데 사용됩니다. QGraphicsItem에서 직접 상속하면 정의를 제공하지 않고도 모두 잘 작동하는 것으로 보이지만 QGraphicsWidgetshape() 함수를 재정의하고 QWidget::rect() (클래스에도 정의되어 있지 않을 수 있음)을 반환하기 때문에 QGraphicsItem의 기본 구현은 그렇지 않습니다. QGraphicsWidget에서 상속하면 더 이상 사용되지 않습니다.

노드에 대해 그릴 원을 둘러싸는 타원을 반환하는 모양 함수의 정의를 제공하면 노드가 작동하기 시작할 수 있습니다. 예를 들면 다음과 같습니다.

QPainterPath MyGraphicsWidget::shape() const 
{ 
    QPainterPath path; 
    path.addEllipse(QPointF(0, 0), 25, 25); 
    return path; 
} 

이 질문은 오래된 질문 일 수 있습니다. 그러나이 문제를 해결하기 위해 3 시간을 보냈습니다. 잘하면이 대답은 당신이 아니라면 누군가에게 유용합니다;)

관련 문제