gpt4 book ai didi

c++ - QGraphicsScene mouseMoveEvent 在 QGraphicsView wheelEvent 之前不起作用

转载 作者:行者123 更新时间:2023-11-28 02:19:35 26 4
gpt4 key购买 nike

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

现在的症状:

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

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

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

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

在创建 View 时调用,一切正常。它调用扩展的 View::wheelEvent,甚至在场景创建之前都没有更改 View ,但之后程序的行为符合预期。

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

如果有帮助,这里是 View::wheelEvent 覆盖代码。 tform 是一个 QTransform,我用它来保持缩放。此外,我尝试过调用和不调用基本方法,但行为没有变化。

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);

}

最佳答案

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

If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved. If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed.

如果这确实是问题所在,请调用 setMouseTracking(true)可能会让你得到你正在寻找的行为。

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

关于c++ - QGraphicsScene mouseMoveEvent 在 QGraphicsView wheelEvent 之前不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33005464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com