我有一点问题
我正在编写Petri网模拟器...
我有两个不同的班级
class PNItem : public QObject, public QGraphicsItem
...
和
class PNEdge : public QGraphicsLineItem
当我打电话...
QGraphicsItem *QGraphicsScene::ItemAt(//cursor position)
,有可能以某种方式了解我点击了什么项目? RESP。 ItemAt给出了什么项目?
答案 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