2012-07-30 13 views
5

Tengo una necesidad de integrar un control de zoom para un QGraphicsView en Qt 4.x, tengo una aplicación de trabajo que va más o menos así:deslizador de zoom QGraphicsView

connect(slider, SIGNAL(valueChanged(int)), customGraphicsView, SLOT(setZoomLevel(int)); 

En la ranura para setZoomLevel tengo la siguiente

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

Así que mi problema se derivan de acoplamiento de un cursor que tiene un valor de n a m para representar un nivel de zoom a la función scale() de QGraphicsView, que toma dos valores de coma flotante para multiplicar la escena por t o obtener un nuevo tamaño.

Así que el problema que estoy teniendo es, si toma 1 * .9 * 1.1 todavía no recibe 1, pero en cambio .99, se apaga un poco porque no es una fórmula correcta. Así que mi zoom máximo se hace más pequeño y más pequeño con el tiempo.

Las llamadas recursivas se deben a que el control deslizante a veces saltaba los valores en las diapositivas rápidas, lo que aumentaba el "error", por lo que lo alisé un poco.

¿Hay una forma correcta de manejar los acercamientos?

Respuesta

7

Esto me tomó un tiempo para averiguarlo también. El problema es que QGraphicsView :: scale() combina el nivel de escala con el nivel de escala actual. En lugar de tratar:

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

Aviso en el documentation que hay un segundo parámetro opcional de combine = false. Esto es bueno porque no quieres combinar las transformaciones.

Si tiene otras transformaciones en su QGraphicsView además de la escala, la sugerencia anterior las descartará. En ese caso, simplemente usaría QGraphicsView::transform() para obtener la transformación actual, que puede modificar como prefiera, y luego usar QGraphicsView::setTransform() para configurarla nuevamente.

+0

Muchas gracias. Esto realmente debería mencionarse en la documentación bajo escala(). –

Cuestiones relacionadas