graphicsview在项目之前接收鼠标事件

时间:2015-04-20 09:20:18

标签: qt qgraphicsview qgraphicsscene qmouseevent

我已经使用

鼠标移动事件在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事件,所以当我尝试调整项目大小时,视图开始一直平移。

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

2 个答案:

答案 0 :(得分:1)

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

因此,在视图中,通过在场景坐标中获取鼠标位置并使用QGraphicsScene::items( )

检索该位置的项目,检查鼠标是否在项目上方以进行平移。

答案 1 :(得分: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);
}