2012-04-11 170 views
3

我有一个小问题QGraphicsScene :: itemAt() - 如何识别自定义类

我编程Petri网模拟器......

我有两个不同的类

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 
}