实现缩放滑块 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 的滑块与 QGraphicsView
的 scale()
函数匹配以表示缩放级别,该函数需要两个浮点值将场景乘以得到一个新尺寸。
所以我遇到的问题是,如果你取 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的主要内容,如果未能解决你的问题,请参考以下文章