Qt C++ 允许多个 QGraphicsItem 处理一个鼠标事件

3
我创建了一个实现QGraphicsItem的Chartblock对象。我的目标是创建一个这些对象的网格,当鼠标按钮被按下(并保持按下状态)并拖动到每个块上时,在光标进入每个块时对每个块执行某些操作。
由于QGraphicsItem在其内部被点击时会捕获鼠标事件,因此其他项将不会触发mouseMoveEvent。因此,我创建了一个基于QGraphicsItemGroup的对象来处理所有鼠标事件,但是我需要一种方法将mousePressEvent / mouseReleaseEvent以及mouseMoveEvent传递给光标悬停在其上的每个子项。
我是否过于考虑如何做到这一点?看起来这样一个简单的操作不应该那么难创建,但是由于QGraphicsItems将鼠标事件保留给自己,我不确定如何解决它。我已经阅读了类似的情况,但是没有什么能给出直接的答案。
编辑:我想一种方法是在数组中跟踪我创建的每个QGraphicsItem的坐标/大小,然后在Group mouseMoveEvent中获取光标的位置,并查看是否有命中。

看起来这个旧问题正是我想要做的,但没有提到真正的解决方案。 - dajaffe
1个回答

1
我能够汇集几个相似的答案来创建一个解决方案;我放弃了将所有的 QGraphicItem 放置在一个 Group 中的想法,而是直接把它们放在场景上。通过场景捕获所有鼠标事件,我让 mouseMoveEvent 检查当前位置是否在 QGraphicsItem 上方 - 如果是,则执行某些操作。
我仍然需要尝试让 itemAt() 对我的实现 QGraphicsItem 的类起作用,因为 itemAt 仅返回 QGraphicsItem,但我确定可以通过一些强制转换使其起作用。
void ChartScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QPointF mousePosition = event->scenePos();
    QGraphicsItem* pItem = this->itemAt(mousePosition.x(), mousePosition.y());
}

关于您回答中的问题:itemAt()返回一个QGraphicsItem,您可以在其上调用type(),这是一个虚函数,您可以在派生类中重写并返回指示您类类型的自定义值。 - Martin Hennings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接