首页 > 解决方案 > 带有 QPropertyAnimation 的椭圆动画

问题描述

我正在尝试为椭圆的外观设置动画(使其从一个小点变成一个大椭圆)。我阅读了文档并查看了各种示例,但没有任何效果。现在有以下代码:

class ellAnimation(QtCore.QObject):
    def __init__(self):
        super(ellAnimation, self).__init__()
        self.mRect = QtCore.QRectF(0, 0, 1, 1)
        self.mItem = QtWidgets.QGraphicsEllipseItem()
        self.mItem.setRect(self.mLine)
        self.mItem.setPen(
            QPen(QColor("black"), 2))

        self.mAnimation = QtCore.QPropertyAnimation(
            self,
            b"rect2",
            parent=self,
            startValue=QtCore.QRectF(0, 0, 1, 1),
            endValue=QtCore.QRectF(0, 0, 500, 500),
            duration=1000,
        )
        self.mAnimation.start()

    def rect1(self):
        return self.mRect.getRect()

    def setRect1(self, rect1):
        self.mRect.setRect(rect1)
        self.mItem.setRect(self.mRect)

    def rect2(self):
        return self.mRect.getRect()

    def setRect2(self, rect2):
        self.mRect.setRect(rect2)
        self.mItem.setRect(self.mRect)

    rect1 = QtCore.pyqtProperty(QtCore.QRectF, fget=rect1, fset=setRect1)
    rect2 = QtCore.pyqtProperty(QtCore.QRectF, fget=rect2, fset=setRect2)

在主代码中,我以这种方式添加到场景中:

animation = ellAnimation() self.scene.addItem(animation.mItem)

这是尝试重做线条动画的代码。帮我重做椭圆动画。

标签: pythonpyqtpyqt5

解决方案


使用 OP 提供的代码很难知道错误在哪里(除了未显示对象之外,还有许多未声明的元素),因此错误的原因可能很多,所以我会避免这种情况,我只会显示一个功能代码,而不是项目在 QObject 中并且它的信息被更新我将使 QObject 公开属性并通过信号更新项目:

from PyQt5 import QtCore, QtGui, QtWidgets


class ManagerRectAnimation(QtCore.QObject):
    rectChanged = QtCore.pyqtSignal(QtCore.QRectF)

    def __init__(self, parent=None):
        super(ManagerRectAnimation, self).__init__(parent)
        self._rect = QtCore.QRectF()

        self._animation = QtCore.QPropertyAnimation(
            self, targetObject=self, propertyName=b"rect", duration=1000
        )

    @property
    def animation(self):
        return self._animation

    def rect(self):
        return self._rect

    def setRect(self, r):
        self._rect = r
        self.rectChanged.emit(r)

    rect = QtCore.pyqtProperty(
        QtCore.QRectF, fget=rect, fset=setRect, notify=rectChanged
    )


def main():
    import sys

    app = QtWidgets.QApplication(sys.argv)

    scene = QtWidgets.QGraphicsScene()
    view = QtWidgets.QGraphicsView(scene)

    item = QtWidgets.QGraphicsEllipseItem()
    scene.addItem(item)

    manager_animation = ManagerRectAnimation(view)
    manager_animation.rectChanged.connect(item.setRect)
    manager_animation.animation.setStartValue(QtCore.QRectF(0, 0, 1, 1))
    manager_animation.animation.setEndValue(QtCore.QRectF(0, 0, 500, 500))
    manager_animation.animation.start()

    view.resize(640, 480)
    view.show()

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

推荐阅读