我创建了一个实现QGraphicsItem的对象Chartblock。我的目标是创建一个由这些对象组成的网格,当按下(并按住)鼠标按钮并将其放在每个块上时,在光标进入每个块时对其执行某些操作。

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

我是否在想怎么做?看起来这么简单的操作似乎并不难创建,但是由于QGraphicsItems本身具有鼠标事件,因此我不确定该如何解决。我读过类似的情况,但似乎没有一个简单的答案。

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

最佳答案

我能够汇总一些类似的答案来创建解决方案。我放弃了将所有QGraphicItem放置在一个组中的想法,并将它们直接放置在场景中。在捕获所有鼠标事件的场景下,我执行mouseMoveEvent检查以查看当前位置是否在QGraphicsItem的顶部-如果是,请执行一些操作。

我仍然需要尝试让itemAt()为实现QGraphicsItem的我自己的类工作,因为itemAt仅返回QGraphicsItem的类,但是我确定某些强制转换应该可以使它工作。

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

关于c++ - Qt C++让多个QGraphicsItem处理一个鼠标事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8549390/

10-11 16:57