2010-09-16 135 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()); 
}