首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QGraphicsScene mouseMoveEvent要到QGraphicsView wheelEvent才能工作

QGraphicsScene mouseMoveEvent要到QGraphicsView wheelEvent才能工作
EN

Stack Overflow用户
提问于 2015-10-08 02:10:16
回答 1查看 2K关注 0票数 0

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

现在用于症状:

我以场景中的一个项目作为应用程序的开头。如果单击并按住,然后移动鼠标,则项目将按预期移动。一旦我释放鼠标按钮,项目停止移动。我可以点击删除并根据Scene::mousePressEvent中的drop代码放置项目。再试一次,但只有在按下鼠标按钮时,项目才会移动。

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

所以最明显的解决办法是:

代码语言:javascript
运行
复制
    wheelEvent(new QWheelEvent(QPointF(0,0),0,Qt::NoButton,Qt::NoModifier));

在创建视图时调用,一切都正常。它调用扩展的View::wheelEvent,对视图没有任何更改,甚至在场景创建之前,但之后程序按照预期的方式运行。

所以我来这里看看是否有任何优秀的Qt专家能解释这种奇怪的行为。如有任何意见或指导,敬请见谅。

如果有帮助,下面是View::wheelEvent重写代码。tform是一个QTransform,我用它来维护缩放。此外,我尝试了调用基本方法和不调用,但是行为没有变化。

代码语言:javascript
运行
复制
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);

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-08 03:33:25

如果没有可以查看和测试的SSCCE,很难确定,但您所描述的内容听起来很像您的mouseMoveEvent()回调,只有在移动过程中按住鼠标按钮时才会调用。反过来,这听起来很像mouseMoveEvent()的预期行为,如QWidget::mouseMoveEvent()中所描述的

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

如果这确实是问题所在,那么打个电话给setMouseTracking(真)可能会让你得到你想要的行为。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33005464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档