1

我已经使用鼠标移动事件在 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 事件已被首先调用,因此当我尝试调整项目大小时,视图开始一直平移。

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

4

2 回答 2

1

视图将始终首先接收鼠标事件。

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

于 2015-04-20T09:28:40.040 回答
1

您可以调用 的基类实现QGraphicsView并检查该事件是否被接受。但是,我会在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);
}
于 2015-04-20T09:30:50.517 回答