我有一个奇怪的问题,我无法确定原因。基本上,我创建了一个带有平移和缩放功能的2D视图,以及一个带有可以通过网格捕捉移动的项目的场景。为了移动场景中的项目,我扩展了Scene::mousePressEvent
以获得指向项目的指针和Scene::mouseMoveEvent
以保持项目在光标上的跟踪。要删除该项目,我再次使用Scene::mousePressEvent
。为了平移,我延长了View::mousePressEvent
,View::mouseReleaseEvent
和View::mouseMoveEvent
并缩放了View::wheelEvent
。
现在出现症状:
我使用场景中的项目启动应用程序。如果我单击并按住,然后移动鼠标,项目将按预期移动。一旦我松开鼠标按钮,该项目就会停止移动。我可以点击放下,根据Scene::mousePressEvent
中的放置代码放置项目。再次尝试仍然只有按下鼠标按钮时项目才会移动。
然后是奇怪的部分:如果我使用鼠标滚轮缩放视图,那么在该事件之后一切都按预期执行。单击鼠标选择一个项目,当我移动鼠标时它会移动,当我再次单击时它会下降。
所以显而易见的解决方案:
wheelEvent(new QWheelEvent(QPointF(0,0),0,Qt::NoButton,Qt::NoModifier));
在创建View时调用,一切正常。它调用扩展的View::wheelEvent
而不更改视图,甚至在创建场景之前,但之后程序的行为与预期一致。
所以我在这里看看是否有任何优秀的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);
}
答案 0 :(得分:2)
没有SSCCE来查看和测试,很难肯定地说,但你所描述的内容听起来很像你的mouseMoveEvent()回调只会在鼠标按钮被调用时被调用搬家期间。反过来,这听起来很像mouseMoveEvent()的预期行为,如QWidget::mouseMoveEvent()中所述:
如果关闭鼠标跟踪,则仅在a时发生鼠标移动事件 移动鼠标时按下鼠标按钮。如果鼠标 跟踪打开,即使没有鼠标也会发生鼠标移动事件 按下按钮。
如果确实存在问题,那么拨打setMouseTracking(true)可能会让您获得所需的行为。
在更广泛的层面上,请注意有更简单的方法来获取您尝试实现的行为 - 例如,允许用户在QGraphicsScene中拖放项目,您真正需要做的就是调用setFlags (QGraphicsItem :: ItemIsMovable)在您希望用户能够拖动的任何QGraphicsItem上。除非您尝试获取某些非标准行为,否则不需要对事件处理程序进行手动编码。