QGraphicsScene :: itemAt() - 如何识别自定义类

时间:2012-04-11 22:20:54

标签: qt qgraphicsscene

我有一点问题

我正在编写Petri网模拟器...

我有两个不同的班级

    class PNItem : public QObject, public QGraphicsItem
    ...

    class PNEdge : public QGraphicsLineItem

当我打电话...

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

,有可能以某种方式了解我点击了什么项目? RESP。 ItemAt给出了什么项目?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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