2012-07-30 3 views
5

구현 나는 Qt는 4.x의에서 QGraphicsView, 나는 이런 식으로 뭔가를가는 작업을 구현 한을 줌 슬라이더를 통합 할 필요가있는 다음 그래서 내 문제 t 현장을 곱 개의 부동 소수점 값을 얻어 QGraphicsViewscale() 함수로 줌 상태를 나타내는 m을 N의 값을 갖는 슬라이더를 정합 따른된다줌 슬라이더를 QGraphicsView

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; 
} 

새로운 크기를 얻으십시오.

그래서 내가 가지고있는 문제는 1 * .9 * 1.1을 취하면 여전히 올바른 수식이 아니기 때문에 1이 아니라 .99가 나오지 않는다는 것입니다. 따라서 내 최대 줌은 시간이 지남에 따라 점점 작아집니다.

재귀 호출은 슬라이더가 빠른 슬라이드에서 값을 건너 뛰기 때문에 "오류"가 증가하여 재사용 호출이 때로는 붕대를 부드럽게하기 위해 부드럽게 처리했기 때문입니다.

줌을 올바르게 처리하는 방법이 있습니까?

답변

7

이것은 나도 알아낼 수 있습니다. 문제는 QGraphicsView :: scale()이 눈금 수준과 현재 눈금 수준을 결합한다는 것입니다. 대신하려고 : combine = false의 선택적인 두 번째 매개 변수가 거기에 있다는 documentation에서

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

공지 사항. 이것은 변환을 결합하고 싶지 않기 때문에 좋습니다.

스케일링 외에도 QGraphicsView에 다른 변형이있는 경우 위 제안에 따라 변형됩니다. 이 경우 QGraphicsView::transform()을 사용하여 현재 변환을 가져오고 원하는대로 변경할 수 있으며 QGraphicsView::setTransform()을 사용하여 다시 설정합니다.

+0

정말 고마워요. 이 정보는 scale() 아래의 설명서에서 실제로 언급해야합니다. –