5

我需要QGraphicsView在 Qt 4.x 中为 a 集成一个缩放滑块,我有一个像这样的工作实现:

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需要两个浮点值来将场景乘以以获得新的大小。

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

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

是否有处理缩放的正确方法?

4

1 回答 1

7

这也花了我一段时间才弄清楚。问题是 QGraphicsView::scale() 将比例级别与当前比例级别结合在一起。而是尝试:

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

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

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

于 2012-07-30T16:06:19.877 回答