2012-07-30 17 views
5

Mam potrzebę włączenia suwak powiększenia na QGraphicsView w Qt 4.x, mam pracę, że idzie wdrożenie coś takiego:Wdrażanie suwak zoom QGraphicsView

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

w gnieździe na setZoomLevel mam następujące

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

Więc mój problem jest wynikająca z parzeniem suwak, który ma wartość n do m do reprezentowania poziomu powiększenia do funkcji scale() z QGraphicsView, który trwa dwie wartości zmiennoprzecinkowych pomnożyć sceny przez t o uzyskać nowy rozmiar.

Problem polega na tym, że jeśli weźmiesz 1 * .9 * 1.1, nadal nie otrzymasz 1, ale zamiast tego .99, nieznacznie się wyłączy, ponieważ nie jest to poprawna formuła. Mój maksymalny zoom z czasem staje się coraz mniejszy.

Wywołania rekursywne polegają na tym, że suwak czasami pomijał wartości na szybkich slajdach, co zwiększało "błąd", więc wygładziłem go, aby nieco go bandażować.

Czy jest prawidłowy sposób obsługi powiększenia?

Odpowiedz

7

Zajęło mi to trochę czasu. Problem polega na tym, że QGraphicsView :: scale() łączy poziom skali z bieżącym poziomem skali. Zamiast próbować:

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

zawiadomienie w documentation że nie ma opcjonalny drugi parametr combine = false. Jest to dobre, ponieważ nie chcesz łączyć transformacji.

Jeśli posiadasz inne transformacje w QGraphicsView oprócz skalowania, powyższa sugestia odrzuci je. W takim przypadku wystarczy użyć QGraphicsView::transform(), aby uzyskać aktualną transformację, którą można dowolnie zmieniać, a następnie użyć QGraphicsView::setTransform(), aby ustawić ją ponownie.

+0

Dziękuję bardzo. To powinno być naprawdę wspomniane w dokumentacji pod skalą(). –