3

我有一个小问题

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

我有两个不同的课程

    class PNItem : public QObject, public QGraphicsItem
    ...

    class PNEdge : public QGraphicsLineItem

当我打电话...

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

,是否有可能以某种方式了解我点击了什么项目?分别 ItemAt 给了什么项目?

4

2 回答 2

4

由于您只有两种类型,因此您可以使用dynamic_casting 并检查转换是否成功:

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
}
于 2012-04-11T22:35:16.020 回答
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

于 2012-04-11T22:41:16.723 回答