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?
2
A
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.
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()
J'ai essayé, mais je n'ai aucun signal. Mais je vais encore essayer. Et merci. – user427305
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
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. –