如何在 pyqt5 中制作旋转动画?
How do I animate a rotation in pyqt5?
如何设置旋转动画?在我的例子中,我有一个 QVariant 类型的角度。阅读文档我看到要使用 QVariantAnimation 对某些东西进行动画处理,我的变量必须是 QVariant 类型,在本例中是 Float。但是我的代码不是运行。我不知道 float 在 Qt 的最后一个版本中是否是 QVariant 而不是更多。
这是我的代码,有人可以帮助我吗?提前致谢!
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
pen = QtGui.QPen(QtGui.QColor(0, 24, 128, 200), 10, style=QtCore.Qt.SolidLine, cap=QtCore.Qt.SquareCap)
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
central_widget = QtWidgets.QWidget()
self.scene = QtWidgets.QGraphicsScene(self)
self.view = QtWidgets.QGraphicsView(self.scene)
self.view.setSceneRect(self.view.mapToScene(self.view.viewport().rect()).boundingRect())
self.btn = QtWidgets.QPushButton('Rotate')
self.btn.clicked.connect(self.animateRotation)
hbox = QtWidgets.QHBoxLayout(central_widget)
hbox.addWidget(self.view)
hbox.addWidget(self.btn)
self.scene.addEllipse(QtCore.QRectF(0, 0, 100, 250), pen=pen)
self.view.setBackgroundBrush(QtGui.QBrush(QtCore.Qt.CrossPattern))
self.setCentralWidget(central_widget)
print(self.scene.items()[0])
def rot(self, angle: QtCore.QVariant) -> None:
self.view.rotate(self.scene.items()[0].rotation()-angle)
self.scene.items()[0].setRotation(angle)
@QtCore.pyqtSlot()
def animateRotation(self):
animation = QtCore.QVariantAnimation()
animation.setStartValue(QtCore.QVariant(0))
animation.setEndValue(QtCore.QVariant(45))
animation.start(QtCore.QAbstractAnimation.DeleteWhenStopped)
animation.valueChanged.connect(self.rot)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
问题是animation变量的生命周期,因为是局部变量,只有animateRotation执行完才会销毁,也就是动画一开始,所以animation不会生效.
解决方法是延长变量的生命周期,在Qt的情况下有以下方案:
通过将animation
更改为self.animation
来使class的变量属性。
将生命周期较长的父级传递给QVariantAnimation
,例如self
变量:animation = QtCore.QVariantAnimation(self)
.
如何设置旋转动画?在我的例子中,我有一个 QVariant 类型的角度。阅读文档我看到要使用 QVariantAnimation 对某些东西进行动画处理,我的变量必须是 QVariant 类型,在本例中是 Float。但是我的代码不是运行。我不知道 float 在 Qt 的最后一个版本中是否是 QVariant 而不是更多。
这是我的代码,有人可以帮助我吗?提前致谢!
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
pen = QtGui.QPen(QtGui.QColor(0, 24, 128, 200), 10, style=QtCore.Qt.SolidLine, cap=QtCore.Qt.SquareCap)
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
central_widget = QtWidgets.QWidget()
self.scene = QtWidgets.QGraphicsScene(self)
self.view = QtWidgets.QGraphicsView(self.scene)
self.view.setSceneRect(self.view.mapToScene(self.view.viewport().rect()).boundingRect())
self.btn = QtWidgets.QPushButton('Rotate')
self.btn.clicked.connect(self.animateRotation)
hbox = QtWidgets.QHBoxLayout(central_widget)
hbox.addWidget(self.view)
hbox.addWidget(self.btn)
self.scene.addEllipse(QtCore.QRectF(0, 0, 100, 250), pen=pen)
self.view.setBackgroundBrush(QtGui.QBrush(QtCore.Qt.CrossPattern))
self.setCentralWidget(central_widget)
print(self.scene.items()[0])
def rot(self, angle: QtCore.QVariant) -> None:
self.view.rotate(self.scene.items()[0].rotation()-angle)
self.scene.items()[0].setRotation(angle)
@QtCore.pyqtSlot()
def animateRotation(self):
animation = QtCore.QVariantAnimation()
animation.setStartValue(QtCore.QVariant(0))
animation.setEndValue(QtCore.QVariant(45))
animation.start(QtCore.QAbstractAnimation.DeleteWhenStopped)
animation.valueChanged.connect(self.rot)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
问题是animation变量的生命周期,因为是局部变量,只有animateRotation执行完才会销毁,也就是动画一开始,所以animation不会生效.
解决方法是延长变量的生命周期,在Qt的情况下有以下方案:
通过将
animation
更改为self.animation
来使class的变量属性。将生命周期较长的父级传递给
QVariantAnimation
,例如self
变量:animation = QtCore.QVariantAnimation(self)
.