2014-04-06 1 views
2

장면에서 마우스 아래에있는 항목을 찾으려고합니다. 내가 사용하는 코드는 다음과 같습니다 :QGraphicsScene의 마우스 근처 항목

QPainterPath mousePath; 
    mousePath.addEllipse(mouseEvent -> pos(),5,5); 
    QList<QGraphicsItem *> itemsCandidate = this->items(mousePath); 
    if (!(itemsCandidate.contains(lastSelectedItem))) lastSelectedItem =itemsCandidate.first(); 

추신 : 이것은 장면을 나타냅니다.

코드는 마우스 위치 주변의 작은 원과 교차하는 항목을 찾아 이전 교차 교차가 여전히 교차되는 경우 항목 포인터를 변경하지 않고 그렇지 않으면 QList에서 첫 번째 항목을 가져야합니다.

불행히도이 코드는 서로 내부의 항목에는 사용할 수 없습니다. 예를 들어 Rect면이 Rect 인 경우 외부 Rect는 내부 Rect에 인접한 경우에도 항상 마우스 위치를 교차합니다. 어떻게 해결할 수 있을까요?

UPDATE :이 보인다 다각형에 문제가 아니지만, 등 사각형, 타원과

UPDATE :이 코드는 재정의 장면에 :: mouseMoveEvent

답변

0

당신은에 mouseMoveEvent을 구현할 수 있습니다 QGraphicsView‍는보기에서 마우스 이동 이벤트를 캡처와 같은 마우스 근처 항목 추적 : 그것은 동북아 즉 전체 모양을 항목 원점의 위치를하지 사용하기 때문에 내가 제대로 이해한다면

void MyView::mouseMoveEvent(QMouseEvent *event) 
{ 
    QPointF mousePoint = mapToScene(event->pos()); 

    qreal x = mousePoint.x(); 
    qreal y = mousePoint.y(); 

    foreach(QGraphicsItem * t , items()) 
    { 
     int dist = qSqrt(qPow(t->pos().x()-x,2)+qPow(t->pos().y()-y,2)); 
     if(dist<70) 
     { 
      //do whatever you like 
     } 
    } 

    QGraphicsView::mouseMoveEvent(event); 
} 
+0

이 작동하지 않습니다 발견 된 나머지 항목은 가까운 근원이 더 가까운 가장자리가 아닌 것입니다. – Francesco

+0

mouse_position에서 오브젝트의 가장자리까지 법선을 계산하는 메소드를 구현해야합니다. 직사각형, 원, 타원과 같은 사소한 사물의 경우 이것은 아주 사소한 것입니다. – OnWhenReady

+0

그래서 박스 방법은 없다. 유일한 선택은 items()을 사용하여 영역에서 교차하는 항목을 선택하고 항목 당 수동으로 거리를 계산하는 것입니다. – Francesco