2012-04-11 1 views
3

사용자 정의 클래스 ...QGraphicsScene :: itemAt() - 내가 조금 문제</p> <p>내가 페트리 네트의 시뮬레이터를 프로그래밍하고 있습니다

나는 두 개의 다른 클래스

class PNItem : public QObject, public QGraphicsItem 
    ... 

를 인식하는 방법과

class PNEdge : public QGraphicsLineItem 

내가 전화 ...

QGraphicsItem *QGraphicsScene::ItemAt(//cursor position) 

어떻게 든 알 수 있습니까? 내가 클릭 한 항목은 무엇입니까? resp. 어떤 아이템이 ItemAt에 의해 주어진 아이템입니까? 당신은 두 가지 유형을 가지고 있기 때문에

답변

4

GraphicsItem::type()이 문제를 해결하기 위해 사용하기위한 것입니다.

그래서 당신은 예를 들어 이런 짓을 할 것이다 : 당신이 할 수있는 것

enum ItemType { TypePNItem = QGraphicsItem::UserType + 1, 
       TypePNEdge = QGraphicsItem::UserType + 2 } 

class PNItem : public QObject, public QGraphicsItem { 

    public: 
     int type() { return TypePNItem; } 
    ... 

}; 

:

QGraphicsItem *item = scene->itemAt(x, y); 
switch(item->type()) 
{ 
    case PNItem: 
     ... 
     break; 
} 

이렇게도 qgraphicsitem_cast

참조의 사용을 가능하게 또한 : QGraphicsItem::UserType

4

, 당신은 단지 dynamic_cast ING를 사용하고 캐스트가 성공적으로 완료되었는지 확인할 수 :

QGraphicsItem *item = scene->ItemAt(pos); 
PNEdge *as_pnedge; 
PNItem *as_pnitem; 
if((as_pnedge = dynamic_cast<PNEdge*>(item))){ 
    // do stuff with as_pnedge 
}else if((as_pnitem = dynamic_cast<PNItem*>(item))){ 
    // do stuff with as_pnitem 
}