Simple PySide/PyQt QPropertyAnimation
-
Hi,
I'm struggling to get an animation working. It seems that animation outside of my class work fine, however as soon as I run them from withing the class, they refuse to start. Can anyone tell me what's wrong with my code:
@import sys
from PySide import QtCore, QtGui
class Pixmap(QtCore.QObject):
def init(self, pix):
super(Pixmap, self).init()if type(pix) == type(""): pix = QtGui.QPixmap(pix) self.pixmap_item = QtGui.QGraphicsPixmapItem(pix) self.pixmap_item.setCacheMode(QtGui.QGraphicsItem.DeviceCoordinateCache) def set_pos(self, pos): self.pixmap_item.setPos(pos) def get_pos(self): return self.pixmap_item.pos() def get_opacity(self): return self.pixmap_item.opacity() def set_opacity(self, opacity): self.pixmap_item.setOpacity(opacity) pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos) opacity = QtCore.Property(float, get_opacity, set_opacity)
"""
Sets up the subclassed QGraphicsView
"""
class ImageWidget(QtGui.QGraphicsView):
LastPanPoint = None
CurrentCenterPoint = Nonedef __init__(self, parent=None): super(ImageWidget, self).__init__(parent) self.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform) # set-up the scene self.scene = QtGui.QGraphicsScene() self.setScene(self.scene) def loadImage(self, f): # Load image pixmap = Pixmap(f) item = pixmap.pixmap_item item.setOpacity(0) self.scene.addItem(item) anim = QtCore.QPropertyAnimation(pixmap, "opacity") anim.setDuration(10000) anim.setStartValue(0.0) anim.setEndValue(1.0) anim.setEasingCurve(QtCore.QEasingCurve.InOutBack) QtCore.QTimer.singleShot(1000, anim, QtCore.SLOT("start()")) QtCore.QObject.connect(anim, QtCore.SIGNAL("finished()"), anim, QtCore.SLOT("deleteLater()"))
if name == "main":
a = QtGui.QApplication(sys.argv)
view = ImageWidget()
view.setGeometry(100,100, 900, 600)
view.loadImage(sys.argv[1])view.show() a.exec_()@
-
Hi
This answer may be a little help but I hope it helps someone nevertheless.
In ImageWidget.loadImage, you create anim as a local variable. That means it's going to be garbage collected at the end of th call : as soon as the call is over, the animation is deleted, and won't have any effect.
There is two ways to solve the problem :
- Define anim as an object attribute (@self.anim = …@)
- Set anim as a child of the current object, so that it keeps a reference to anim and prevent the garbage collection (@anim = QtCore.QPropertyAnimation(pixmap, "opacity", self)@)