2014-05-22 4 views
0

내가 일부 사용자 지정 QGraphicsItems에게이 돌아갑니다.
주어진 (x, y) 좌표에서보기에 Item이 있는지 알고 싶습니다. 내가 가진 내 응용 프로그램에서를 QGraphicsView :: itemAt() 메소드는 항상 <em>QGraphicsScene</em>의 <em>를 QGraphicsView</em> 제로

class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     if (QGraphicsItem *item = itemAt(event->scenePos())) { 
      qDebug() << "You clicked on item" << item; 
     } 
     else { 
      qDebug() << "You didn't click on an item."; 
     } 
    } 
}; 

:

  • 클래스 "화면 : 화면 (는 QWidget * 부모)는 QWidget (부모

    내가 QGraphicsScene로 다음과 같은 클래스를 사용 목적을 테스트하려면) {...} "내 클래스의 인스턴스 내부"CustomScene : public QGraphicsScene {...} "및 클래스 QGraphicsView의 인스턴스와 함께.
  • QGraphicsView에 추가 된 "Rect : public QGraphicsRectItem {...}"클래스의 일부 인스턴스는 계산 후 일부 직사각형을 그립니다.

응용 프로그램을 실행하고 그려진 직사각형을 클릭하면 항상 "항목을 클릭하지 않았습니다." 메시지.

이전 게시물에서 검색하거나 Google에서 검색하면서 코드가 작동하지 않는 이유를 찾지 못했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 1 : boundingRect() 메서드가 올바르게 반환됩니다. QGraphicsRectItem을 추가하려고 시도했는데 itemAt() 메서드가 해당 정보를 올바르게 반환합니다.

+0

사용자 지정 항목이 올바른 경계 rect를 반환합니까? – Omid

+0

예, 내 맞춤 항목의 boundingRect() 메소드가 올바른 정보를 반환합니다. 나는 이것을 "Edit 1"에 추가했다. – diegob

+0

'shape()'을 오버라이드 했습니까? 이것은 히트 감지에 사용됩니다. 특히 –

답변

0

문제는 QPainterPath QGraphicsItem::shape() const [virtual] 메서드를 재정의하지 않았기 때문입니다.
완료되면 itemAt() 메서드가 예상대로 작동하기 시작했습니다.