问题在于,当我致电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
的使用的理解中必定存在我遗漏的东西。
我搜索谷歌的答案,但没有出现任何问题,无论如何都与我无关。我找到的最接近的是another SO question,但我仍然无法将其转化为自己的答案。我也看到了关于自定义插补器的一些内容,我是否需要制作自定义插补器,如果是这样,我该怎么做。
答案 0 :(得分:1)
酷代码。它几乎可以工作,但动画并没有持续通过enterEvent(虽然我不完全理解它的机制。)如果你改变了
ani = QPropertyAnimation(self,"color")
到
self.ani = QPropertyAnimation(self, "color")
# etc
然后它会起作用。
答案 1 :(得分:0)
我很困惑,因为“动画”从未打印出来,但是ani.state()表示 动画正在运行。
在print
处,过渡存在并且正在运行。当Python
enterEvent
返回的数据,ani
超出范围。因为没有别的
对对象的引用,Python垃圾假设存在
无需维护未引用的对象。由于对象是
删除后,动画将永远不会执行。
那很有趣,我很想知道为什么动画必须是一个属性 物体。
接受的答案将ani
更改为self.ani
。此更改提供了
引用范围enterEvent
之外的对象。在更正的代码中,
当enterEvent
退出时,该对象会维护对ani
的引用,它是
由于额外的参考,不再收集垃圾。当Qt存在
返回事件循环,动画成功执行。