2012-07-30 12 views
5

ho una necessità di integrare un dispositivo di scorrimento dello zoom per una QGraphicsView in Qt 4.x, ho un'implementazione di lavoro che va qualcosa come questo:Implementazione cursore dello zoom QGraphicsView

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

Nella slot per setZoomLevel ho il seguente

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

Quindi il mio problema derivante dall'attuale accoppiamento un cursore che ha un valore di n per m rappresentare un livello di zoom alla funzione scale() di QGraphicsView, che prende due valori in virgola mobile a moltiplicare la scena da t o ottieni una nuova taglia.

Quindi il problema che sto riscontrando è che se prendi 1 * .9 * 1.1 non ottieni ancora 1 ma invece .99, è leggermente off perché non è una formula corretta. Quindi il mio zoom massimo diventa sempre più piccolo nel tempo.

Le chiamate ricorsive sono perché il cursore salta a volte i valori sulle diapositive veloci, il che ha aumentato l'errore, quindi l'ho smussato per fasciarlo un po '.

Esiste un modo corretto per gestire gli zoom?

risposta

7

Questo mi ci è voluto un po 'per capire anche. Il problema è che QGraphicsView :: scale() combina il livello di scala con il livello corrente della scala. Invece di cercare:

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

Avviso nel documentation che c'è un secondo parametro opzionale di combine = false. Questo è buono perché non vuoi combinare le trasformazioni.

Se sono presenti altre trasformazioni sulla QGraphicsView oltre al ridimensionamento, il suggerimento sopra riportato le eliminerà. In tal caso, si utilizzerà semplicemente lo QGraphicsView::transform() per ottenere la trasformazione corrente, che è possibile modificare come preferisci, quindi utilizzare QGraphicsView::setTransform() per impostarlo nuovamente.

+0

Grazie mille. Questo dovrebbe essere menzionato nella documentazione in scala(). –

Problemi correlati