如图所示。
我在QScrollArea中有QWidget。 QWidget充当单元图像和一些基于矢量的轮廓数据的渲染小部件。 用户可以进行放大/缩小,简单发生的是,它会改变QPainters比例并根据需要改变QWidget的大小。
现在我想对鼠标下的点进行放大/缩小。 (比如GIMP中的缩放动作)。 如何根据缩放级别计算滚动条的新位置? 在不使用scrollarea的情况下使用转换实现它更好吗?
答案 0 :(得分:3)
一种解决方案可能是从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());
}
答案 1 :(得分:0)
无效QScrollArea::ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50)
会做你需要的吗?
答案 2 :(得分:0)
您需要在QWidget上选择wheelEvent()
,获取event.pos()并在缩放QWidget后立即将其传递到QscrollArea.ensureVisible()
。
def wheelEvent(self, event):
self.setFixedSize(newWidth, newHeight)
self.parent().ensureVisible(event.pos())
这应该或多或少地产生你想要的东西。