Одним из решений может быть получение нового класса из QScrollArea и переопределение, например, wheelEvent
, чтобы масштабирование выполнялось с помощью колеса мыши и в текущей позиции курсора мыши.
Этот метод работает путем соответствующей регулировки положения полосы прокрутки, чтобы отразить новый уровень масштабирования.Это означает, что до тех пор, пока не будет видимой полосы прокрутки, масштабирование не будет происходить под позицией курсора мыши.Это поведение большинства приложений для просмотра изображений.
void wheelEvent(QWheelEvent* e) {
double OldScale = ... // Get old scale factor
double NewScale = ... // Set new scale, use QWheelEvent...
QPointF ScrollbarPos = QPointF(horizontalScrollBar()->value(), verticalScrollBar()->value());
QPointF DeltaToPos = e->posF() / OldScale - widget()->pos() / OldScale;
QPointF Delta = DeltaToPos * NewScale - DeltaToPos * OldScale;
widget()->resize(/* Resize according to new scale factor */);
horizontalScrollBar()->setValue(ScrollbarPos.x() + Delta.x());
verticalScrollBar()->setValue(ScrollbarPos.y() + Delta.y());
}