如何在 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).