2010-09-16 106 views
3

如图所示。 alt text放大/缩小滑音点?

alt text

我有一个QWidget的内部QScrollArea。 QWidget充当细胞图像和某些基于矢量的轮廓数据的渲染窗口部件。 用户可以放大/缩小,简单地发生的是,它改变了QPainters的比例,并且改变了QWidget大小的大小。

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

回答

0

将无效QScrollArea::ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50)做你所需要的?

0

您需要拿起QWidget上的wheelEvent(),获取event.pos()并将其传递到QscrollArea.ensureVisible(),即在将QWidget缩放后。

def wheelEvent(self, event): 
    self.setFixedSize(newWidth, newHeight) 
    self.parent().ensureVisible(event.pos()) 

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

+1

不,这是没有开箱即用的解决方案的问题“执行放大/缩小在鼠标下的点”的海报。你说,它会或多或少地产生他想要的东西。 – bkausbk 2015-08-28 09:46:36

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()); 
}