2012-07-30 94 views
5

我有一個需要縮放滑塊集成在Qt 4.x的一個QGraphicsView,我有一個工作的實現,是這樣的:實現縮放滑塊的QGraphicsView

connect(slider, SIGNAL(valueChanged(int)), customGraphicsView, SLOT(setZoomLevel(int)); 

在插槽setZoomLevel我有以下

void CustomView::setZoomLevel(int level) 
{ 
    if(zoomLevel - level < -1){ 
     setZoomLevel(level - 1); 
    }else if(level - zoomLevel < -1){ 
     setZoomLevel(level + 1); 
    } 
    if(level < zoomLevel){ 
     scale(1 - (scaleFactor * (zoomLevel - level)), 1 - (scaleFactor * (zoomLevel - level))); 
    }else if (level > zoomLevel){ 
     scale(1 + (scaleFactor * (level - zoomLevel)), 1 + (scaleFactor * (level - zoomLevel))); 
    } 

    zoomLevel = level; 
} 

所以我的問題是與匹配具有n到m的值來表示縮放級別的QGraphicsViewscale()功能,這需要兩個浮點值的T乘以現場滑塊詞幹o獲得新的尺寸。

所以我遇到的問題是,如果你採取1 * .9 * 1.1,你不會得到1,而是0.99,它的關閉稍微有點因爲它不是一個正確的公式。所以隨着時間的推移,我的最大變焦越來越小。

遞歸調用是因爲滑塊有時會跳過快速幻燈片上的值,從而增加了「錯誤」,所以我將其平滑一點,以便對它進行繃帶處理。

是否有正確的方法來處理縮放?

回答

7

這花了我一段時間才弄清楚。問題是QGraphicsView :: scale()將比例級別與當前比例級別相結合。相反,嘗試:在documentation

setTransform(QTransform::fromScale(sx, sy)); 

注意,還有的combine = false一個可選的第二個參數。這很好,因爲你不想合併變換。

如果除縮放之外還有其他的QGraphicsView轉換,上面的建議將會丟棄它們。在這種情況下,您只需使用QGraphicsView::transform()即可獲取當前轉換,您可以隨意更改,然後使用QGraphicsView::setTransform()再次設置。

+0

非常感謝。 這應該在scale()中的文檔中真正提到。 – 2012-07-30 16:25:16