实现缩放滑块QGraphicsView

Joh*_*acs 5 c++ math user-interface qt qgraphicsview

我需要QGraphicsView在Qt 4.x中集成缩放滑块,我有一个工作实现,如下所示:

connect(slider, SIGNAL(valueChanged(int)), customGraphicsView, SLOT(setZoomLevel(int));
Run Code Online (Sandbox Code Playgroud)

在插槽中,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;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题源于将一个值为n的滑块与m相交以表示scale()函数的缩放级别,该滑块QGraphicsView采用两个浮点值来乘以场景以获得新的大小.

所以我遇到的问题是,如果你拿1*.9*1.1,你仍然不会得到1而是.99,因为它不是一个正确的公式而略微偏离.所以我的最大变焦随着时间的推移越来越小.

递归调用是因为滑块有时会跳过快速幻灯片上的值,这会增加"错误",因此我将其平滑以将其包扎一点.

是否有正确的处理变焦的方法?

Ant*_*ony 7

我花了一段时间才弄明白.问题是QGraphicsView :: scale()将比例级别与当前比例级别相结合.而是尝试:

setTransform(QTransform::fromScale(sx, sy));
Run Code Online (Sandbox Code Playgroud)

请注意文档中有可选的第二个参数combine = false.这很好,因为您不想组合转换.

如果你的QGraphicsView除了缩放之外还有其他转换,上面的建议将丢弃它们.在这种情况下,您只需使用QGraphicsView::transform()获取当前变换,您可以随意更改,然后再使用QGraphicsView::setTransform()它进行设置.