5

Qt4.xにズームスライダーを統合する必要があります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の値を持つスライダーを、のscale()関数に結合することから生じています。この関数はQGraphicsView、2つの浮動小数点値を使用して、シーンに新しいサイズを取得します。

したがって、私が抱えている問題は、1 * .9 * 1.1をとった場合でも、1は得られず、代わりに.99が得られるということです。これは、正しい数式ではないため、わずかにずれています。したがって、私の最大ズームは時間の経過とともにますます小さくなります。

再帰呼び出しは、スライダーが高速スライドの値をスキップすることがあり、「エラー」が増加したためです。そのため、スライダーを滑らかにして少し包帯を巻いたのです。

ズームを処理する正しい方法はありますか?

4

1 に答える 1

7

これも理解するのに少し時間がかかりました。問題は、QGraphicsView :: scale()がスケールレベルを現在のスケールレベルと結合することです。代わりに試してください:

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

ドキュメントには、オプションの2番目のパラメータがあることに注意してくださいcombine = false。変換を組み合わせたくないので、これは良いことです。

スケーリング以外にQGraphicsViewに他の変換がある場合、上記の提案はそれらを破棄します。その場合はQGraphicsView::transform()、現在の変換を取得するために使用します。これは、好きなように変更してから、を使用QGraphicsView::setTransform()して再度設定できます。

于 2012-07-30T16:06:19.877 に答える