python - 带有 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)
这是尝试重做线条动画的代码。帮我重做椭圆动画。
解决方案
使用 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()
推荐阅读
- reactjs - 将渲染的组件存储在变量中
- python - 空行后获取值
- c# - c# 带括号的匿名类型声明
- python - 即使连接已经存在,同一个客户端试图从不同的端口连接到服务器?
- github - github,是否自动生成拉取请求以提升依赖版本总是安全的?
- regex - 我们如何编写正则表达式 (regex) 来识别具有单位的数量,例如“54.20 克”?
- python - 在 Python 中的某些约束下生成集合的最大子集
- c# - 升级 Windows Server 2019 后,我的网站出现 ERR_CONNECTION_ERROR
- java - 为什么我们要检查我的最后一行/列?康威生命游戏
- flutter - 在 index.html 中访问 --dart-define 环境变量