gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:34:30 25 4
gpt4 key购买 nike

我的代码成功返回一个 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 * ,从列表中获取后我尝试了一些方法,但似乎没有任何方法可以解决问题。这可能吗?

最佳答案

编辑

问题是您的函数返回一个 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 .

附言我想再一次提到,您通常复制对象的唯一情况是您希望将其保留以供本地使用。也就是说,您想更改它,这样更改就不会反射(reflect)在原始实例中。或者您希望保持对象所处的状态,并且不希望对原始状态的更改影响到您的状态。

对于几乎所有其他目的,通过指针访问对象与制作拷贝一样强大和有用,如果不是更有用的话。

关于c++ - 从 QGraphicsItem Qt C++ 获取实际对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30133169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com