graphicsview 在 item 之前接收到鼠标事件

graphicsview receives mouse event before the item

我已经在 QGraphicsView 上实现了平移视图,使用鼠标移动事件

void View::mouseMoveEvent(QMouseEvent* event) {
pan();
QGraphicsView::mouseMoveEvent(event);
}

并且在这个视图的场景中,我添加了一些项目,其中一些项目可以调整大小,所以我实现了

void Item::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
 if(m_resizeMode)
    {
      resize();
      e->accept();
    }
}

我尝试使用 e->accept() 过滤鼠标移动,使其不再传播到任何地方 但是我的 View mouseMove 事件首先被调用,所以每当我尝试调整项目大小时,视图开始一路平移。

如何避免此事件从视图传播到场景。

视图总是先接收到鼠标事件。

因此,在视图中,通过获取场景坐标中的鼠标位置并使用 QGraphicsScene::items( )[=11 检索该位置的项目,在允许项目平移之前检查鼠标是否在项目上方=]

您可以调用 QGraphicsView 的基础 class 实现并检查事件是否被接受。但是,我会在 mousePressEvent 而不是 mouseMoveEvent 中执行此操作。毕竟这是您决定是否应该调整项目大小或进行一些平移的地方。这就是我在我的项目中做类似事情的方式:

void View::mousePressEvent(QMouseEvent *event)
{
    ...
    QGraphicsView::mousePressEvent(event);
    if(event->isAccepted())
        move = false;
    else
        move = true;
}

void View::mouseMoveEvent(QMouseEvent *event)
{
    if(!move)
    {
        QGraphicsView::mouseMoveEvent(event);
        return;
    }
    ... // you would do the panning here

    QGraphicsView::mouseMoveEvent(event);
}

void View::mouseReleaseEvent(QMouseEvent *event)
{
    if(!move)
    {
        QGraphicsView::mouseReleaseEvent(event);
        return;
    }
    else
    {
        ...
        move = false;
    }
    QGraphicsView::mouseReleaseEvent(event);
}