【问题标题】:Get the actual object from QGraphicsItem Qt C++从 QGraphicsItem Qt C++ 获取实际对象
【发布时间】:2015-07-19 22:06:10
【问题描述】:

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

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 *,我在从列表中获取它后尝试了一些方法,但似乎没有任何效果。这甚至可能吗?

【问题讨论】:

  • 它是一个具有内存位置的对象,您可以通过它检索。你想用这个对象做什么?
  • 我想调用它的getter方法来获取一个私有变量。我将如何检索对象?
  • 我仍然不完全确定您的意思。对象存储在内存位置。您可以有一个本地对象,或指向存储在不同位置的对象的指针。您可以通过复制您拥有的对象来创建本地对象。但是,您可以对本地对象执行的操作没有区别。以及通过结构解除引用 (->) 访问的对象允许您做什么。
  • @laurisvr 我认为我们在同一页上。我想复制 QGraphicsItem 的 this 参数中的对象。你能告诉我怎么做吗?
  • 这是个好问题。如果我是你,我只会将所有指向添加到场景中的对象模型的指针存储在一个列表中,你知道添加的对象的类型。并且只需循环 throw itemsList 以比较 itemsList 和我的 modelList 中的指针。

标签: c++ qt class oop object


【解决方案1】:

编辑

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

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

对于几乎所有其他目的,通过指针访问对象与制作副本一样强大和有用,甚至更多。

【讨论】:

  • 这里的问题不是真正的复制,问题是itemLists返回一个指向QGraphicsItem的指针列表,并且在场景中,有不同类型的QGraphicsItem。所以主要的问题是要知道你得到的指针是哪种类型。
  • @Martin Aah 我明白了。这就说得通了。恐怕一般来说,唯一的解决方案是尝试不同的沮丧。 qt 的哪个方面非常有能力让我泪流满面
  • 是的,我过去尝试过这样的事情,现在,我正在尝试遵循这个逻辑。我总是将我想用视图显示的模型存储在某个地方。如果由于随机 View 事件,如果我需要与 View 关联的模型,我只需使用 View 为我提供足够的信息,以便在我的商店模型中找到正确的模型(如 ID、地址等... )。我很少使用视图直接给我我的模型。不知道是不是真的可以理解。
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多