写作思路

本篇博客主要实现在QGraphicsItem 添加特效,主要是基于QParallelAnimationGroup这个类实现动画的播放,实现效果如下,创建可以创建并让星星往复闪烁
本文是在PyQt创建UE蓝图这篇文章的基础上扩展的,将原有的节点绘制改为星星,并添加闪烁特效。
实现步骤:
1、创建一个场景提供绘制,可参考QGraphicsScene、QGraphicsView的基础使用
2、基于QGraphicsItem创建一个星星item
3、基于QParallelAnimationGroup给星星添加特效

1、创建一个场景提供绘制

可参考QGraphicsScene、QGraphicsView的基础使用

2、基于QGraphicsItem创建一个星星item

class StarItem(QGraphicsItem):def __init__(self, scene, parent=None):super(StarItem, self).__init__(parent)self.setFlag(QGraphicsItem.ItemIsMovable, True)self.setFlag(QGraphicsItem.ItemIsSelectable, True)self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)self.setFlag(QGraphicsItem.ItemIsFocusable, True)self.scene = sceneself.radius = 50self.anim = Noneself.addAnimation()def addAnimation(self):self.anim = StarAnimation(self, 0.25)self.anim.start()def stopAnimation(self):if self.anim:self.anim.stop()self.anim = Noneself.graphicsEffect().setColor(QColor(0x00, 0x00, 0x00, 0x00))def createGraphicsEffect(self):dropShadow = QGraphicsDropShadowEffect()dropShadow.setColor(QColor(0xff, 0x00, 0x00, 0xff))dropShadow.setBlurRadius(50)dropShadow.setOffset(0)self.setGraphicsEffect(dropShadow)def paint(self, painter, style, *args, **kwargs):painter.setRenderHint(QPainter.Antialiasing)painter.setRenderHint(QPainter.TextAntialiasing)R = self.radiusPi = 3.1415926deg = Pi * 72 / 180points = [QPoint(R, 0),QPoint(R * cos(deg), -R * sin(deg)),QPoint(R * cos(2 * deg), -R * sin(2 * deg)),QPoint(R * cos(3 * deg), -R * sin(3 * deg)),QPoint(R * cos(4 * deg), -R * sin(4 * deg)),]font = QFont()font.setPointSize(12)font.setBold(True)painter.setFont(font)penLine = QPen()penLine.setWidth(2)penLine.setColor(Qt.blue)penLine.setStyle(Qt.SolidLine)penLine.setCapStyle(Qt.FlatCap)penLine.setJoinStyle(Qt.BevelJoin)painter.setPen(penLine)painter.rotate(54)starPath = QPainterPath()starPath.moveTo(points[0])starPath.lineTo(points[2])starPath.lineTo(points[4])starPath.lineTo(points[1])starPath.lineTo(points[3])starPath.closeSubpath()painter.drawPath(starPath)def boundingRect(self):return QRectF(0, 0, self.radius, self.radius)

简要分析一下
1、首先星星的绘制方法在paint中

2、boundingRect方法要重写并且一定要重写,这样才能控制星星,相当于给星星增加了一个触碰区域

3、我们在星星内部封装了三个方法,分别是
生成特效 createGraphicsEffect:使用Qt自带的阴影特效QGraphicsDropShadowEffect,提供一个包围绘制路径内的一个投影

开始动画 startAnimation:创建一个动画的特效,如果不创建这个动画,投影只会静止在星星上

结束动画 stopAnimation:停止动画,并且将投影透明化(也可以直接置None)

3、基于QParallelAnimationGroup给星星添加特效

class StarAnimation(QParallelAnimationGroup):def __init__(self, item, duration):super(StarAnimation, self).__init__()self.item = itemself.duration = durationself.anim = Noneself.finished.connect(self.onFinished)def createAnimations(self):graphicsEffect = self.item.graphicsEffect()if not graphicsEffect:self.item.createGraphicsEffect()graphicsEffect = self.item.graphicsEffect()qba = QByteArray()qba.append("color")anim = QPropertyAnimation(graphicsEffect, qba)anim.setDuration(self.duration * 1000)anim.setStartValue(QColor(0xff, 0x00, 0x00, 0xff))anim.setEndValue(QColor(0x00, 0x00, 0x00, 0xff))self.addAnimation(anim)def start(self, policy=QAbstractAnimation.KeepWhenStopped):self.createAnimations()super(StarAnimation, self).start(policy)def onFinished(self):if self.item:self.item.addAnimation()

要了解两个东西,一个是该动作组的基类QParallelAnimationGroup,另一个是控制属性变化的类QPropertyAnimation

QParallelAnimationGroup: 提供了一个动画组,用于存放动画,并且这些动画是同时播放的,其中几个关键的方法:

①addAnimation(QAbstractAnimation *animation):将动画添加到动画组内

②start(QAbstractAnimation::DeletionPolicy policy = KeepWhenStopped):开始动画

③stop(): 结束动画,其中结束之后会回调 finished()

QPropertyAnimation: 动画的本质就是逐帧变化,我们要提供动画特效产生的是哪几个属性,下面讲一下几个注意的点和几个封装好的关键函数:

①QPropertyAnimation(QObject *target, const QByteArray &propertyName, QObject *parent = nullptr),初始化函数,注意两个点:

1、传入的第一个参数的基类必须是QObject,我们这里使用QGraphicsDropShadowEffect对象基类就是QObject,QGraphicsDropShadowEffect文档

2、传入的第二个参数是QByteArray 对象,并且这个 propertyName必须是要存在于target里面 的,因此我们需要对第二个参数进行一个转化!如下

qba = QByteArray()qba.append("color")

如果传入的propertyName不存在于target是会报错的哦!

②setDuration(int msecs): 属性变化的持续时间(单位是毫秒哦!)

③setStartValue(const QVariant &value):设置初始值(你的这个属性变化的初始状态)

④setEndValue(const QVariant &value):设置终值(属性的结束值)

最后补充一点

在一个 QParallelAnimationGroup 是可以插入多个动画的,因此我们可以创建多个QPropertyAnimation,例如下面:

 def createAnimations(self):graphicsEffect = self.item.graphicsEffect()if not graphicsEffect:self.item.createGraphicsEffect()graphicsEffect = self.item.graphicsEffect()qba = QByteArray()qba.append("color")anim = QPropertyAnimation(graphicsEffect, qba)anim.setDuration(self.duration * 1000)anim.setStartValue(QColor(0xff, 0x00, 0x00, 0xff))anim.setEndValue(QColor(0x00, 0x00, 0x00, 0xff))self.addAnimation(anim)qba = QByteArray()qba.append("blurRadius")anim = QPropertyAnimation(graphicsEffect, qba)anim.setDuration(self.duration * 1000)anim.setStartValue(50)anim.setEndValue(500)self.addAnimation(anim)

可以观察到下面gif 不仅仅有颜色上的闪烁,还有光圈的缩放

最后附上一张早期QQ网图 哈哈哈哈哈哈

QParallelAnimationGroup的使用——创建简单的动画相关推荐

  1. 简单的动画函数封装(2)

    <div></div><!-- <span></span> --><button class="btn1"> ...

  2. 简单的动画函数封装(1)

    //创建简单的动画函数封装效果(目标对象,目标位置) function animate(obj,target){var id = setInterval(function(){if(obj.offse ...

  3. html如何创建关键帧动画旋转,[教程] 用 CSS3 Animations(动画) 和 Keyframes(关键帧) 创建简单的网页动画 – CSS3 实现弹跳球动画...

    通过这个有趣的教程学习 CSS Animations(动画) 和 Keyframes(关键帧). 我们要做什么? 下面是最终代码,也就是我们将要最终实现的演示: 基础准备 对于这个实现,我们需要一个简 ...

  4. CSS3 创建简单的网页动画 – 实现弹跳球动

    基础准备 对于这个实现,我们需要一个简单的 div ,并且样式类名为 ball : HTML 代码: <div class="ball"></div> 我们 ...

  5. three.js创建简单动画(vue中使用three.js59)

    简单动画 1.demo效果 2.知识要点 2.1 three.js动画分类 2.1.1基础动画 2.1.2移动相机 2.1.3变形和蒙皮 2.1.4加载外部动画 2.2 基础动画实现方式 2.2.1 ...

  6. Maya创建科幻3D动画循环场景视频教程

    Maya创建科幻3D动画循环场景视频教程 Skillshare – Create a Sci-Fi 3D Animation Loop in Autodesk Maya 持续时间3h 27m 包括项目 ...

  7. Windows Phone 8初学者开发—第22部分:用演示图板创建卷盘的动画

    原文 Windows Phone 8初学者开发-第22部分:用演示图板创建卷盘的动画 第22部分: 用演示图板创建卷盘的动画 原文地址:http://channel9.msdn.com/Series/ ...

  8. Qt基于QGraphicsObject自定义图元并实现简单的动画

    文章目录 Qt基于QGraphicsObject自定义图元并实现简单的动画 举例; Qt基于QGraphicsObject自定义图元并实现简单的动画 Qt 图形的绘制 可以是QPainter方法直接绘 ...

  9. 计算机动画分为关键帧动画和,一个最简单的动画最少有几个关键帧

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 一个最简单的动画至少有两个关键帧,两个关键帧中必须是元件,而且必须是同一个元件.要创建使组合体或文字发生颜色渐变的动画,必须先将它 ...

  10. 自定义动画属性java_创建酷炫动画效果的10个JavaScript库

    原标题:创建酷炫动画效果的10个JavaScript库 1) Dynamics.jsDynamics.js是设计基于物理规律的动画的重要Java库.它可以赋予生命给所有包含CSS 和SVG属性的DOM ...

最新文章

  1. StaticFactoryMethod_Level2
  2. js算法入门(2)--哈希表
  3. Android中脱离WebView使用WebSocket实现群聊和推送功能
  4. linux tr 变量大小写,使用tr命令快速达到大小写互换——深圳培训linux
  5. ubuntu linux本地源,如何制作UbuntuLinux操作系统的本地源?
  6. CCIE试验备考之交换security
  7. 使用 vue_VUE使用ECharts教程
  8. 三到五年Java简历模板
  9. Python:SEIR传染病模型
  10. 设置计算机屏幕保护程序,电脑屏保怎么设置?一键设置电脑屏幕保护方法
  11. win7系统修改磁盘提示参数错误的解决办法
  12. 清除此计算机中wps云盘,Win10专业版系统怎么把电脑上的WPS网盘彻底删掉?
  13. 北京超级云计算中心操作训练指南
  14. 为什么视频云服务会被各行业广泛看好?
  15. 如何在windows下运用dd来下修复坏块?
  16. 计算机硬件有哪些升级空间等级查询,你的电脑要不要升级内存?怎么升级?答案都在这里~...
  17. PLS-00907: cannot load library unit
  18. October 20th 2017 Week 42nd Friday
  19. (一)Flink从入门到项目实战——Flink介绍——董长春
  20. mysql 执行计划 order_MySQL · 捉虫动态 · 5.6中ORDER BY + LIMIT 错选执行计划

热门文章

  1. Java开发工作面试总结(转)
  2. 关键字排名优化—百度推广
  3. 百度CTO王海峰:百度智能云加速AI工业化大生产
  4. idea cant resolve symbol问题解决
  5. 电商数据监测——调味品行业数据分析
  6. 第三十一章 Caché 命令大全 WHILE 命令
  7. 快速排序 求第k大数
  8. 行政管理专科计算机实践怎么考,在读专科生(计算机)能否报考自考本科(行政管理)...
  9. x86汇编实现一个注入器
  10. 小猪浅谈pdf转换成txt转换器哪个好