我有一个奇怪的问题,我一直无法确定原因。基本上,我创建了具有平移和缩放功能的2D视图以及可以通过网格对齐移动的项目。要移动场景中的项目,我扩展了Scene::mousePressEvent
以获取指向该项目的指针,并且使Scene::mouseMoveEvent
获得指示器以跟踪光标上的项目。要删除该项目,我再次使用了Scene::mousePressEvent
。为了平移,我扩展了View::mousePressEvent
,View::mouseReleaseEvent
和View::mouseMoveEvent
并将I扩展为View::wheelEvent
。QGraphicsScene mouseMoveEvent不工作,直到QGraphicsView wheelEvent
现在的症状:
我开始与场景中的项目的应用程序。如果我点击并按住,然后移动鼠标,该项目将按预期移动。只要我释放鼠标按钮,该项目停止移动。我可以点击放下,并根据Scene::mousePressEvent
中的下拉代码放置该项目。再试一次,只有当鼠标按钮被按下时,项目才会移动。
然后出现奇怪的部分:如果我使用鼠标滚轮缩放视图,那么在该事件发生后,所有事情都按预期执行。点击鼠标来选择一个项目,它随着我移动鼠标而移动,当我再次点击时,它会掉落。
那么显而易见的解决方案:
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);
}
请注意,您的显而易见的解决方案被泄露QWheelEvent对象......你会更好放置QWheelEvent对象在栈上,或wheelEvent()返回后,至少将其删除。 –