2016-04-28 3 views
0

Diese Klasse ist meine aktuelle Grafikansicht. Darin präsentiere ich in graphicsscene. Diese Grafikansicht wird durch die Zoom-Funktionen skaliert (die Sie unten sehen können).PyQT Zoomen wird durch mouseMoveEvent() gestört, warum?

from PySide import QtCore, QtGui 
ZOOM_FACTOR = 2 
MAX_ALLOWED_ZOOM = 4 

class MapGraphicsView(QtGui.QGraphicsView): 
    def __init__(self, parent): 
     QtGui.QGraphicsView.__init__(self, parent) 
     self.resize(parent.size().width(), parent.size().height()) 
     self.setAlignment(33) 
     self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse) 
     self.setResizeAnchor(QtGui.QGraphicsView.AnchorUnderMouse) 
     self.setFrameShape(QtGui.QFrame.NoFrame) 
     self.max_allowed_zoom = MAX_ALLOWED_ZOOM 

    # Signal variables used to notify listeners. Listeners are connected in actions.py 
    pressed = QtCore.Signal(QtCore.QEvent) 
    released = QtCore.Signal(QtCore.QEvent) 
    moved = QtCore.Signal(QtCore.QEvent) 

    # Notify listeners when window is clicked 
    def mousePressEvent(self, event): 
     self.pressed.emit(event) 

    def mouseReleaseEvent(self, event): 
     self.released.emit(event) 

    def mouseMoveEvent(self, event): 
     #self.moved.emit(event) 
     pass 

    def zoom_in(self): 
     self.scale(ZOOM_FACTOR, ZOOM_FACTOR) 

    def zoom_out(self): 
     self.scale(1/ZOOM_FACTOR, 1/ZOOM_FACTOR) 

Wirklich, alles funktioniert wunderbar. Nun, es tut, wenn ich das mouseMoveEvent entferne, das im folgenden Code zu sehen ist. Wenn ich das Ereignis entferne, funktioniert alles genau wie vorgesehen: Der Zoom ist perfekt und zentriert direkt über dem Cursor.

Wenn ich die verlassen in mousemove, obwohl es führt nur eine Aktion ..

def mouseMoveEvent(self, event): 
    #self.moved.emit(event) 
    pass 

.. und das Handeln ist Pass die gesamte Zoomfunktion drastisch ändert. Anstatt auf den Mauszeiger zu zoomen, sieht es so aus, als gäbe es keinen Zoom-Anker und das Zoom-Ziel folgt stattdessen einem ganz anderen System.

Da die Zoomfunktion in meinem Produkt entscheidend ist, muss ich das lösen. Jede Hilfe würde sehr geschätzt werden.

+0

Jede Hilfe würde sehr geschätzt werden! – RasmusJ

+0

Mit Ihrem Code kann ich Ihr gemeldetes Verhalten nicht wiederholen, da es kein vollständiges Beispiel ist. Es scheint mir in Ordnung zu sein, obwohl Sie die super().-Methoden irgendwo in den überschriebenen Methoden aufrufen könnten, um sicher zu gehen. – Trilarion

Antwort

0

rufen einfach super vor dem Ereignis behandeln:

def mouseMoveEvent(self, event): 
    super().mouseMoveEvent(event) 
    # your code goes here 

es für mich arbeiten. Vergessen Sie die Frage nicht selbst, wenn eine neu implementierte Methode sie benötigt.

Verwandte Themen