gpt4 book ai didi

c++ - 子类化 QGraphicsItem 使我无法在 QGraphicsScene/View 上使用 itemAt()

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:27 25 4
gpt4 key购买 nike

我已将 QGraphicsItem 子类化到我自己的自定义类 Hexagon 中。当我尝试使用 QGraphicsView::itemAtQGraphicsScene::itemAt 等函数时,它不会返回我的任何 Hexagon对象,因为该函数会查找 QGraphicsItems
我怎样才能告诉它寻找 Hexagon 对象呢?或者我是否需要更改我的 Hexagon 类中的某些内容?或者甚至重新实现 itemAt()

目前,我还在子类化 QGraphicsView,特别是 mousePressedEvent 以获取有关被单击的 Hexagon 对象的一些信息。

void LatticeView::mousePressEvent(QMouseEvent *event)
{
Hexagon *hexagon = itemAt(event->pos());
...
}

但是当我尝试编译时,出现以下错误:

invalid conversion from 'QGraphicsItem*' to 'Hexagon*'

我想要的是能够获得被点击的 Hexagon 对象,这样我就可以访问我在 Hexagon 类中定义的一些变量不隐含在 QGraphicsItem 类中。

最佳答案

要使其正常工作,您需要先转换指针,然后再将其分配给另一种类型的指针变量。

Hexagon *hexagon = (Hexagon*)itemAt(event->pos());

但是这里存在危险,因为 itemAt() 可能返回 NULL 或者该项目可能不是 Hexagon 项目。

事实上,您应该像这样使用 C++ 样式转换:

Hexagon *hexagon = dynamic_cast<Hexagon*>(itemAt(event->pos()));
if (hexagon != NULL)
{
hexagon->hexagonMethod();
}

这将需要通过编译器提供运行时类型信息。

还有一个名为 type()QGraphicsItem 函数可用这将允许您使用 qgraphicsitem_cast() 但这需要一些额外的工作,包括定义一个 enum

还有一点需要注意。根据您的场景和项目消耗鼠标事件的方式,您可能不会总是看到您对 mousePressEvent() 的覆盖在您期望的时候被调用,因为如果鼠标事件可能永远不会到达 View 被场景中的某物消耗。

关于c++ - 子类化 QGraphicsItem 使我无法在 QGraphicsScene/View 上使用 itemAt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9050246/

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