2010-09-16 7 views
3

Comme on le voit sur les photos. alt textZoom avant/arrière sur un point de souris?

alt text

J'ai QWidget l'intérieur d'un QScrollArea. QWidget agit comme un widget de rendu pour l'image de la cellule et certaines données de contour vectorielles. L'utilisateur peut effectuer un zoom avant/arrière et ce qui se passe simplement, c'est qu'il change l'échelle de QPainters et modifie la taille de la taille de QWidget en conséquence.

Maintenant, je veux effectuer le zoom avant/arrière sur le point sous la souris. (comme l'action de zoom dans GIMP). Comment calculer les nouvelles positions des barres de défilement en fonction du niveau de zoom? Vaut-il mieux implémenter ceci en utilisant des transformations sans utiliser une scrollarea?

Répondre

0

Est-ce que vous avez besoin de QScrollArea::ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50)?

0

Vous devez prendre le wheelEvent() sur le QWidget, obtenir le event.pos() et le passer dans le QscrollArea.ensureVisible(), juste après la mise à l'échelle de votre QWidget.

def wheelEvent(self, event): 
    self.setFixedSize(newWidth, newHeight) 
    self.parent().ensureVisible(event.pos()) 

Cela devrait plus ou moins produire ce que vous voulez.

+1

Non ce n'est pas une solution prête à l'emploi pour le problème "effectuer le zoom avant/arrière sur le point sous la souris" de l'affiche. Vous le dites, cela produira «plus ou moins» ce qu'il veut. – bkausbk

3

Une solution pourrait être de dériver une nouvelle classe de QScrollArea et de réimplémenter wheelEvent par exemple afin que le zoom soit effectué avec la molette de la souris et à la position actuelle du curseur de la souris.

Cette méthode fonctionne en ajustant les positions de la barre de défilement en conséquence pour refléter le nouveau niveau de zoom. Cela signifie que tant qu'il n'y a pas de barre de défilement visible, le zoom n'a pas lieu sous la position du curseur de la souris. C'est le comportement de la plupart des applications de visualisation d'images.

void wheelEvent(QWheelEvent* e) { 
    double OldScale = ... // Get old scale factor 
    double NewScale = ... // Set new scale, use QWheelEvent... 

    QPointF ScrollbarPos = QPointF(horizontalScrollBar()->value(), verticalScrollBar()->value()); 
    QPointF DeltaToPos = e->posF()/OldScale - widget()->pos()/OldScale; 
    QPointF Delta = DeltaToPos * NewScale - DeltaToPos * OldScale; 

    widget()->resize(/* Resize according to new scale factor */); 

    horizontalScrollBar()->setValue(ScrollbarPos.x() + Delta.x()); 
    verticalScrollBar()->setValue(ScrollbarPos.y() + Delta.y()); 
} 
Questions connexes