我是这个论坛以及Python和PyQt的新手。 在完成一些基础知识之后,在尝试使用Qt学习动画时,我希望编写一个简单的应用程序,其中将PushButton从屏幕左侧动画地带到另一个按钮点击的某个位置。在这个过程中,我最终编写了这样的代码:
class AppMainUI(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.setWindowFlags(QtCore.Qt.Window|QtCore.Qt.FramelessWindowHint)
self.connect(self.pushButton_4, QtCore.SIGNAL("clicked()"), self.onExitClicked)
self.connect(self.pushButton_5, QtCore.SIGNAL("clicked()"), self.animateButtons)
def animateButtons(self):
animation = QtCore.QPropertyAnimation(self.pushButton, "geometry")
animation.setDuration(2)
animation.setStartValue(QtCore.QRect(0, 0, self.pushButton.width(), self.pushButton.height()))
animation.setEndValue(QtCore.QRect(760, 280, self.pushButton.width(), self.pushButton.height()))
animation.setEasingCurve(QtCore.QEasingCurve.OutElastic)
animation.start()
def onExitClicked(self):
sys.exit(0)
App = QtGui.QApplication(sys.argv)
UI = AppMainUI()
UI.show()
App.exec_()
我看到的是按钮移动到位置(0,0),这实际上是我动画的开始位置。我在这里做错了吗?
答案 0 :(得分:2)
问题是由于垃圾收集器;当方法animateButtons(self)
完成animation.start()
语句时,{em>垃圾收集器会销毁animation
对象,因此动画不会发生。
只需在对象名称的开头添加self
:
self.animation = QtCore.QPropertyAnimation(...)
self.animation.setStartValue(...)
...
同时将持续时间增加到至少1000毫秒,以便动画变得可见,否则它会被执行得如此之快以至于你无法看到它。