PySide QPropertyAnimation无法启动(PySide QPropertyAnim

2019-09-28 19:41发布

问题是,当我叫QPropertyAnimation.start()没有任何反应。

颜色是我在动画和按钮是类属性。

class Button(QPushButton):
    def __init__(self,text="",parent=None):
        super(Button,self).__init__(text,parent)
        # ...
        self.innercolor = QColor(200,0,20)

    def setcolor(self,value): self.innercolor = value
    def getcolor(self): return self.innercolor
    color = Property(QColor,getcolor,setcolor)

    def paintEvent(self, event):
        p = QPainter(self)
        p.fillRect(self.rect(),self.color)
        # ...
        p.end()

    def animated(self,value): print "animating"; self.update()

    def enterEvent(self, event):
        ani = QPropertyAnimation(self,"color")
        ani.setStartValue(self.color)
        ani.setEndValue(QColor(0,0,10))
        ani.setDuration(2000)
        ani.valueChanged.connect(self.animated)
        ani.start()
        print ani.state()
        return QPushButton.enterEvent(self, event)

我很困惑,因为"animating"从来没有打印出来,但ani.state()表示,在动画运行。

我不要求调试我的代码或什么,但我想一定是我丢失的东西,无论是在我的代码或我使用的理解QPropertyAnimation

我搜索谷歌的答案,但无论如何,一无所获,没有什么与我有关。 我发现的最接近是另一个SO问题 ,但我还是不能把它转换成给自己一个答案。 我也看到了一些关于自定义插值,做我需要做一个自定义的内插器,如果是这样,我怎么做。

Answer 1:

冷码。 它几乎工作,但动画不是持久的过去enterEvent(虽然我不完全理解的机制)。如果你改变

ani = QPropertyAnimation(self,"color")

self.ani = QPropertyAnimation(self, "color")
# etc

然后它会工作。



Answer 2:

我很困惑,因为“动画”从来没有打印出来,但ani.state()表示,在动画运行。

在点print的anmiation存在且正在运行。 当Python从返回enterEventani超出范围。 由于没有其他对象的引用,Python的垃圾收集假定没有必要保持未被引用的对象的对象。 由于被删除的对象,动画永远不会执行。

那是有趣的,我很想知道为什么该动画为对象的属性。

该接受的答案改变aniself.ani 。 这种变化提供了refrence到范围外的对象enterEvent 。 在校正后的代码中,当enterEvent退出时,对象维护到参考ani ,这是由于附加的参考收集不再垃圾。 它的存在时的Qt返回到事件循环和动画的成功执行。



文章来源: PySide QPropertyAnimation Not Starting