У меня странная проблема, что я не смог определить причину. В принципе, я создал 2D-представление с функциями панорамирования и масштабирования и сцену с элементами, которые могут перемещаться с привязкой сетки. Чтобы переместить элемент в сцену, я продлил Scene::mousePressEvent
, чтобы получить указатель на этот элемент, и Scene::mouseMoveEvent
, чтобы сохранить элемент, отслеживаемый курсором. Чтобы удалить элемент, я снова использовал Scene::mousePressEvent
. Чтобы кастрюлю, я продлил View::mousePressEvent
, View::mouseReleaseEvent
и View::mouseMoveEvent
и увеличил масштаб. Я увеличил View::wheelEvent
.QGraphicsScene mouseMoveEvent не работает до тех пор, пока QGraphicsView 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);
}
Обратите внимание, что ваше очевидное решение утечки объекта QWheelEvent ... вам лучше разместить объект QWheelEvent в стеке или, по крайней мере, удалить его после возврата wheelEvent(). –