3

少し問題があります

私はペトリネットシミュレータをプログラミングしています...

私は2つの異なるクラスを持っています

    class PNItem : public QObject, public QGraphicsItem
    ...

    class PNEdge : public QGraphicsLineItem

私が電話するとき...

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

、どういうわけか、私がクリックしたアイテムを知ることは可能ですか?それぞれ ItemAtによってどのアイテムがアイテムに与えられますか?

4

2 に答える 2

4

タイプは2つしかないため、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 に答える