После долгих разочарований, похоже, это работает. Кажется, проблема в том, что QGraphicsView
's transform
не имеет ничего общего с ее положением прокрутки, поэтому поведение QGraphicsView::mapToScene(const QPoint&) const
зависит как от положения прокрутки, так и от преобразования. Мне нужно было посмотреть на источник для mapToScene
, чтобы понять это.
Учитывая это, вот что сработало: вспомните точку сцены, на которую указывает мышь, масштабируйте, сопоставьте точку сцены с координатами мыши , затем отрегулируйте полосы прокрутки, чтобы подвести эту точку под мышью:
void ZoomGraphicsView::wheelEvent(QWheelEvent* event)
{
const QPointF p0scene = mapToScene(event->pos());
qreal factor = std::pow(1.01, event->delta());
scale(factor, factor);
const QPointF p1mouse = mapFromScene(p0scene);
const QPointF move = p1mouse - event->pos(); // The move
horizontalScrollBar()->setValue(move.x() + horizontalScrollBar()->value());
verticalScrollBar()->setValue(move.y() + verticalScrollBar()->value());
}