放大/缩小mouser点?

时间:2010-09-16 09:28:33

标签: qt qt4

如图所示。 alt text

alt text

我在QScrollArea中有QWidget。 QWidget充当单元图像和一些基于矢量的轮廓数据的渲染小部件。 用户可以进行放大/缩小,简单发生的是,它会改变QPainters比例并根据需要改变QWidget的大小。

现在我想对鼠标下的点进行放大/缩小。 (比如GIMP中的缩放动作)。 如何根据缩放级别计算滚动条的新位置? 在不使用scrollarea的情况下使用转换实现它更好吗?

3 个答案:

答案 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())

这应该或多或少地产生你想要的东西。