实现缩放滑块 QGraphicsView

Posted

技术标签:

【中文标题】实现缩放滑块 QGraphicsView【英文标题】:Implementing zoom slider QGraphicsView 【发布时间】:2012-07-30 14:55:37 【问题描述】:

我需要在 Qt 4.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 的滑块与 QGraphicsViewscale() 函数匹配以表示缩放级别,该函数需要两个浮点值将场景乘以得到一个新尺寸。

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

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

有处理缩放的正确方法吗?

【问题讨论】:

【参考方案1】:

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

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

注意documentation 中有一个可选的第二个参数combine = false。这很好,因为您不想合并转换。

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

【讨论】:

非常感谢。这确实应该在 scale() 下的文档中提及。

以上是关于实现缩放滑块 QGraphicsView的主要内容,如果未能解决你的问题,请参考以下文章

带有 x 范围滑块的 Y 轴自动缩放

text 缩放滑块

text 缩放滑块

如何使用滑块更改 mapkit 地图视图缩放级别?

php 为woocommerce添加滑块和图像缩放支持

将本机 iphone 相机缩放滑块和 youtube 播放器控制器添加到我的应用程序