2010-09-01 12 views
2

J'ai un QGraphicsView. Pour cela, j'ai ajouté un QGraphicsScene et à cela ajouté un QPixmap (*. Jpeg) et QGraphicsEllipseItem (un cercle). Le QPixmap est beaucoup plus grand que QGraphicsView, donc le défilement est activé. Le problème est que QPixmap et QGraphicsEllipseItem sont en mouvement. Mais je veux une position fixe pour QGraphicsEllipseItem dans QGraphicsView. Il devrait toujours être au centre de QGraphicsView. Comment puis-je faire cela? J'espère que quelqu'un peut aider.Pyqt: Comment définir un élément toujours au centre d'un QGraphicsView lorsque le défilement est possible?

Répondre

1

Ajoutez un gestionnaire de signal pour le signal de défilement des barres de défilement (utilisez QAbstractSlider::sliderMoved()).

Ensuite, vous pouvez interroger la vue pour son décalage gauche/haut et la dimensionner et positionner le cercle en conséquence. Voir l'explication pour QAbstractScrollArea pour vous aider à démarrer.

+0

J'ai essayé, mais je n'ai aucun signal. Mais je vais encore essayer. Et merci. – user427305

+0

Ok, cela fonctionne avec graphicsView.viewport(). InstallEventFilter (self) et graphicsView.setViewportUpdateMode (0). Maintenant, il est possible d'attraper l'événement mouseMove. Ce n'est pas la meilleure façon d'y aller, mais ça fonctionne. – user427305

+0

Je n'attraperais pas un mouvement de souris. Après tout, que se passe-t-il si vous avez besoin de déplacer la vue par programme? Il n'y aura pas de mouseMove à attraper. Mieux vaut se lier aux signaux de la barre de défilement. –

1

Si vous sous-classe QGraphicsView, vous pouvez remplacer la méthode scrollContentsBy pour régler la position de l'ellipse chaque fois que les changements de zone de défilement. Voici un code vraiment minimal:

import sys 
from PyQt4 import QtGui 

class MyView(QtGui.QGraphicsView): 
    def __init__(self, scene, parent = None): 
     super(MyView, self).__init__(parent) 
     self.scene = scene 
     self.setScene(scene) 
     self.ellipse = QtGui.QGraphicsEllipseItem(0, 0, 30, 30, scene = self.scene) 
     self.scene.addItem(self.ellipse) 

    def scrollContentsBy(self, x, y): 
     super(MyView, self).scrollContentsBy(x, y) 
     self.ellipse.setPos(self.mapToScene(28, 28)) 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     super(MainWindow, self).__init__(parent) 
     pixmap = QtGui.QPixmap() 
     pixmap.load('imagefile.jpg') 
     scene = QtGui.QGraphicsScene(self) 
     scene.setSceneRect(0, 0, pixmap.width(), pixmap.height()) 
     item = QtGui.QGraphicsPixmapItem(pixmap) 
     scene.addItem(item) 
     self.view = MyView(scene, self) 
     self.view.setMinimumSize(100, 100) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    mainWindow = MainWindow() 
    mainWindow.show() 
    app.exec_() 

if __name__ == '__main__': 
    main()