让多个QGraphicsItem处理一个鼠标事件

Qt C++ Let multiple QGraphicsItem handle one mouse event

本文关键字:一个 鼠标 事件 QGraphicsItem 处理      更新时间:2023-10-16

我已经创建了一个对象Chartblock来实现QGraphicsItem。我的目标是创建这些对象的网格,当按下(并按住)鼠标按钮并移动到每个块上时,当光标进入每个块时,在每个块上执行一些操作。

由于QGraphicsItem在点击鼠标事件时捕获鼠标事件,其他项目将不会为mouseMoveEvent触发。然后,我基于QGraphicsItemGroup创建了一个对象来处理所有鼠标事件,但随后我需要通过某种方式将mousePressEvent/mouseReleaseEvent以及mouseMoveEvent传递给光标经过的每个子事件。

我是不是想太多了?看起来这样一个简单的操作应该不难创建,但是由于QGraphicsItems为自己保留鼠标事件,我不确定如何绕过它。我读过类似的情况,但似乎没有一个直接的答案。

编辑:我想这样做的一种方法是跟踪我在数组中创建的每一个QGraphicsItem的坐标/大小,然后获得光标在组mouseMoveEvent中的位置,并查看是否有命中。

我能够将一些类似的答案组合在一起创建一个解决方案;我放弃了将所有的QGraphicItem放在一个组中的想法,并将它们直接放在一个场景中。随着场景抓取所有鼠标事件,我有mouseMoveEvent检查当前位置是否在QGraphicsItem的顶部-如果是,执行一些操作。

我仍然需要尝试并获得itemAt()工作为我自己的类实现QGraphicsItem, itemAt只返回QGraphicsItem的,但我确信一些cast应该得到它的工作。

void ChartScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QPointF mousePosition = event->scenePos();
    QGraphicsItem* pItem = this->itemAt(mousePosition.x(), mousePosition.y());
}