一种解决方案可能是从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());
}
Run Code Online (Sandbox Code Playgroud)