Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QGraphicscene::itemAt()-如何识别自定义类_Qt_Qgraphicsscene - Fatal编程技术网

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

Qt QGraphicscene::itemAt()-如何识别自定义类,qt,qgraphicsscene,Qt,Qgraphicsscene,我有一个小问题 我正在编写Petri网模拟器 我有两门不同的课 class PNItem : public QObject, public QGraphicsItem ... 及 当我打电话 QGraphicsItem *QGraphicsScene::ItemAt(//cursor position) ,是否有可能知道我点击了什么项目?分别。什么项目是逐项指定的?由于您只有两种类型,您可以使用动态\u casting,并检查强制转换是否成功: QGraphicsIt

我有一个小问题

我正在编写Petri网模拟器

我有两门不同的课

    class PNItem : public QObject, public QGraphicsItem
    ...

当我打电话

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

,是否有可能知道我点击了什么项目?分别。什么项目是逐项指定的?

由于您只有两种类型,您可以使用
动态\u 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
}
QGraphicsItem*item=scene->ItemAt(pos);
PNEdge*作为_PNEdge;
PNItem*作为\u PNItem;
如果((as_pnedge=动态施法(项目))){
//用as_pnedge做一些事情
}如果((as_pnitem=dynamic_cast(item))){
//用as_pnitem做一些事情
}
旨在解决此问题

所以你可以这样做,例如:

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 *item = scene->itemAt( x, y );
switch( item->type() )
{
    case PNItem:
         ...
         break;
}