我需要在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的滑块匹配,以表示scale()
QGraphicsView
函数的缩放级别,它采用两个浮点值来乘以场景通过获得新的大小。
所以我遇到的问题是,如果你拿1 * .9 * 1.1你仍然没有得到1而是.99,它稍微关闭因为它不是一个正确的公式。因此,随着时间的推移,我的最大变焦会越来越小。
递归调用是因为滑块有时会跳过快速幻灯片上的值,这会增加“错误”,因此我将其平滑以将其包扎一点。
是否有正确的缩放处理方式?
答案 0 :(得分:7)
我花了一段时间才弄明白。问题是QGraphicsView :: scale()将比例级别与当前比例级别相结合。而是尝试:
setTransform(QTransform::fromScale(sx, sy));
请注意documentation中有combine = false
的可选第二个参数。这很好,因为您不想组合转换。
如果你的QGraphicsView除了缩放之外还有其他转换,上面的建议将丢弃它们。在这种情况下,您只需使用QGraphicsView::transform()
获取当前转换,您可以随意更改,然后再使用QGraphicsView::setTransform()
进行设置。