首页 > 解决方案 > 如何在 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_())

标签: pythonrotationpyqt5qgraphicsviewqgraphicsitem

解决方案


问题是动画变量的生命周期,因为它是一个局部变量,只有在 animateRotation 执行完毕后才会销毁,也就是动画一开始,动画就不会起作用。

解决方案是延长变量的生命周期,在 Qt 的情况下有以下选项:

  • 通过更改animation为 来制作类的变量属性self.animation

  • 将具有较长生命周期的父级传递给QVariantAnimation,例如self变量:animation = QtCore.QVariantAnimation(self)


推荐阅读