QGraphicsScene mouseMoveEvent在QGraphicsView wheelEvent之前不起作用

时间:2015-10-08 02:10:16

标签: c++ qt qgraphicsview qgraphicsscene

我有一个奇怪的问题,我无法确定原因。基本上,我创建了一个带有平移和缩放功能的2D视图,以及一个带有可以通过网格捕捉移动的项目的场景。为了移动场景中的项目,我扩展了Scene::mousePressEvent以获得指向项目的指针和Scene::mouseMoveEvent以保持项目在光标上的跟踪。要删除该项目,我再次使用Scene::mousePressEvent。为了平移,我延长了View::mousePressEventView::mouseReleaseEventView::mouseMoveEvent并缩放了View::wheelEvent

现在出现症状:

我使用场景中的项目启动应用程序。如果我单击并按住,然后移动鼠标,项目将按预期移动。一旦我松开鼠标按钮,该项目就会停止移动。我可以点击放下,根据Scene::mousePressEvent中的放置代码放置项目。再次尝试仍然只有按下鼠标按钮时项目才会移动。

然后是奇怪的部分:如果我使用鼠标滚轮缩放视图,那么在该事件之后一切都按预期执行。单击鼠标选择一个项目,当我移动鼠标时它会移动,当我再次单击时它会下降。

所以显而易见的解决方案:

    wheelEvent(new QWheelEvent(QPointF(0,0),0,Qt::NoButton,Qt::NoModifier));

在创建View时调用,一切正常。它调用扩展的View::wheelEvent而不更改视图,甚至在创建场景之前,但之后程序的行为与预期一致。

所以我在这里看看是否有任何优秀的Qt专家可以解释这种奇怪的行为。任何意见或指示都表示赞赏。

如果有帮助,这里是View::wheelEvent覆盖代码。 tformQTransform,我保持缩放。此外,我已尝试使用和不使用基本方法,但行为没有变化。

void SchematicView::wheelEvent(QWheelEvent* event)
{  
    // Scale the view / do the zoom
    double scaleFactor = 1.1;

    if(event->delta() > 0 && tform.m11() < max_zoom) {
        tform.scale(scaleFactor,scaleFactor);
    } else if (event->delta() < 0 && tform.m11() > min_zoom){
        tform.scale(1.0/scaleFactor,1.0/scaleFactor);
    }

    setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    setTransform(tform);

    QGraphicsView::wheelEvent(event);

}

1 个答案:

答案 0 :(得分:2)

没有SSCCE来查看和测试,很难肯定地说,但你所描述的内容听起来很像你的mouseMoveEvent()回调只会在鼠标按钮被调用时被调用搬家期间。反过来,这听起来很像mouseMoveEvent()的预期行为,如QWidget::mouseMoveEvent()中所述:

  

如果关闭鼠标跟踪,则仅在a时发生鼠标移动事件   移动鼠标时按下鼠标按钮。如果鼠标   跟踪打开,即使没有鼠标也会发生鼠标移动事件   按下按钮。

如果确实存在问题,那么拨打setMouseTracking(true)可能会让您获得所需的行为。

在更广泛的层面上,请注意有更简单的方法来获取您尝试实现的行为 - 例如,允许用户在QGraphicsScene中拖放项目,您真正需要做的就是调用setFlags (QGraphicsItem :: ItemIsMovable)在您希望用户能够拖动的任何QGraphicsItem上。除非您尝试获取某些非标准行为,否则不需要对事件处理程序进行手动编码。

相关问题