我有一个奇怪的问题,我一直无法确定原因。基本上,我创建了一个带有pan和缩放功能的2D视图,以及一个可以通过网格快照移动的场景。为了在场景中移动项目,我扩展了Scene::mousePressEvent以获得指向项目的指针,并扩展了Scene::mouseMoveEvent以在光标上跟踪项目。为了删除这个项目,我再次使用了Scene::mousePressEvent。对于pan,我扩展了View::mousePressEvent、View::mouseReleaseEvent和View::mouseMoveEvent,缩放扩展了View::wheelEvent。
现在用于症状:
我以场景中的一个项目作为应用程序的开头。如果单击并按住,然后移动鼠标,则项目将按预期移动。一旦我释放鼠标按钮,项目停止移动。我可以点击删除并根据Scene::mousePressEvent中的drop代码放置项目。再试一次,但只有在按下鼠标按钮时,项目才会移动。
然后,出现了奇怪的部分:,如果我使用鼠标轮缩放视图,那么在该事件发生后,一切都会按预期进行。单击鼠标可选择一个项目,当我移动鼠标时,它会移动,当我再次单击时,它会下降。
所以最明显的解决办法是:
wheelEvent(new QWheelEvent(QPointF(0,0),0,Qt::NoButton,Qt::NoModifier));在创建视图时调用,一切都正常。它调用扩展的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);
}发布于 2015-10-08 03:33:25
如果没有可以查看和测试的SSCCE,很难确定,但您所描述的内容听起来很像您的mouseMoveEvent()回调,只有在移动过程中按住鼠标按钮时才会调用。反过来,这听起来很像mouseMoveEvent()的预期行为,如QWidget::mouseMoveEvent()中所描述的
如果关闭鼠标跟踪,则只有在移动鼠标时按下鼠标按钮时,才会发生鼠标移动事件。如果鼠标跟踪打开,即使没有按鼠标按钮,也会发生鼠标移动事件。
如果这确实是问题所在,那么打个电话给setMouseTracking(真)可能会让你得到你想要的行为。
在更广泛的层面上,请注意,有一些更简单的方法可以获得您想要实现的行为--例如,为了允许用户在QGraphicsScene中拖放项目,您真正需要做的就是在您希望用户能够拖动的任何QGraphicsItems上调用setFlags(QGraphicsItem::ItemIsMovable)。除非您试图获得一些非标准行为,否则没有必要对事件处理程序进行手动编码。
https://stackoverflow.com/questions/33005464
复制相似问题