从QGraphicsItem Qt C ++获取实际对象

时间:2015-05-08 21:32:13

标签: c++ qt class oop object

我的代码在鼠标事件中调用QList<QGraphicsItem *>时成功返回items(event->pos())。代码如下所示:

QList<QGraphicsItem *> itemsList = items(event->pos());
qDebug() << itemsList;

鼠标事件的调试输出,其中有两个对象在彼此之上:

(QGraphicsItem(this =0x10ab8c900, parent =0x0, pos =QPointF(180, 0) , z = 0 , flags =  ( ) ) ,  
 QGraphicsItem (this = 0x10159a800 , parent = 0x0 , pos = QPointF(180, 0) , z = 0 , flags =  ( ) ) )

获得位置等完全没问题,但有没有办法获得实际的对象实例?我看到带有内存地址的this参数,所以我想我知道内存位置。但是我如何将其映射到对象?

我知道后面的QGraphicsItem实例属于Treasure *类型,我从列表中获取后尝试了一些方法,但似乎没有什么可以做到的。这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

修改

问题是你的函数返回一个QGrapihcsItem *的列表。而你需要Treasure *的实例。由于Treasure继承了QGraphicsItem,您可以在此场合应用向下转换。这看起来像这样:

QGraphicsItem * result;
Treasure* myTreasure = dynamic_cast<Treasure>(result); 
if(myTreasure)
{
    //only do something if the cast is a succes
}

原始

根据你问题的对话,我收集了你想复制你的对象。假设您要复制i中给出的索引。这将是实现这一目标的方式:

int i = 0;
Treasure myTreasure(*itemsList[index]);

但是,类型可以禁用此行为。然后仍然可以像这样制作一个简单的副本:

Treasure myTreasure;
memcpy(&myTreasure, itemList[index], sizeof(Treasure); 

但是我强烈建议不要这样做。因为这可能是undefined behaviour

P.S。我想再提一下,你通常复制一个对象的唯一情况是你想保留它供本地使用。也就是说,您想要更改它,以便更改不会反映在原始实例中。或者您希望保持对象所处的状态,并且不希望更改原始文件以影响您的对象。

对于几乎所有其他目的而言,通过指针访问对象与制作副本一样强大且有用,如果不是这样的话。