初学动画。无敌踩坑,资料真的是太少了。。。。。本坑是一个大坑,只有解决方法,但实质原因仍不清楚

在一篇资料中了解到我们可以通过QGraphicsView来实现动画QPropertyAnimation

自己随意写了一个测试界面大致如下

#!/usr/bin/python3
# -*- coding: utf-8 -*- """
Author: semishigure
Website: zetcode.com
Last edited: 2018.03.01
""" from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * import cgitb
import sys cgitb.enable(format='text') # 解决pyqt5异常只要进入事件循环,程序就崩溃,而没有任何提示 class Ball(QObject): def __init__(self):
super().__init__()
# self.pixmap_item = QGraphicsPixmapItem(QPixmap("ball.png"))
self.pixmap_item = QGraphicsEllipseItem(5, 30, 20, 20)
self._set_pos(QPointF(5, 30)) def _set_pos(self, pos):
self.pixmap_item.setPos(pos) pos = pyqtProperty(QPointF, fset=_set_pos) class Myview(QGraphicsView):
def __init__(self):
super().__init__()
self._set_color(QColor(105, 105, 105))
self.iniAnimation() def _set_color(self, col):
self.palette = QPalette()
# self.palette.setColor(self.backgroundRole(), col)
self.palette.setBrush(self.backgroundRole(), col)
self.setPalette(self.palette) def iniAnimation(self):
self.anim2 = QPropertyAnimation(self, b'color')
self.anim2.setDuration(1000)
self.anim2.setStartValue(QColor(105, 105, 105))
self.anim2.setKeyValueAt(0.1, QColor(255, 255, 240))
self.anim2.setKeyValueAt(0.3, QColor(219, 225, 171))
self.anim2.setKeyValueAt(0.7, QColor(148, 214, 184))
self.anim2.setEndValue(QColor(86, 199, 170)) color = pyqtProperty(QColor, fset=_set_color) class Example(Myview): def __init__(self):
super().__init__() self.initView()
self.iniui() def initView(self):
self.ball = Ball() self.anim = QPropertyAnimation(self.ball, b'pos')
self.anim.setDuration(1000)
self.anim.setStartValue(QPointF(5, 30)) self.anim.setKeyValueAt(0.3, QPointF(80, 30))
self.anim.setKeyValueAt(0.5, QPointF(200, 30))
self.anim.setKeyValueAt(0.8, QPointF(250, 250))
self.anim.setEndValue(QPointF(290, 30))
# self.anim.start() # self.linearGradient = QLinearGradient(100, 100, 200, 200)
# self.linearGradient.setColorAt(0.2,QColor(255, 255, 240))
# self.linearGradient.setColorAt(0.6,QColor(255, 0, 0))
# self.linearGradient.setColorAt(1.0,QColor(255, 255, 0))
# self._set_color(self.linearGradient) self.scene = QGraphicsScene(self)
self.scene.setSceneRect(0, 0, 300, 300)
self.scene.addItem(self.ball.pixmap_item)
self.setScene(self.scene) self.setWindowTitle("Ball animation")
self.setRenderHint(QPainter.Antialiasing)
self.setGeometry(300, 300, 500, 350)
self.show() def iniui(self):
self.btn = QPushButton("开始")
self.btn2 = QPushButton("结束")
self.maingrid = QGridLayout()
self.setLayout(self.maingrid)
self.maingrid.addWidget(self.btn, 0, 0)
self.maingrid.addWidget(self.btn2, 1, 0)
self.btn.clicked.connect(self.runAnim) def runAnim(self):
self.anim.start()
self.anim2.start() if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

主要是一个颜色渐变的动画和一个物体移动的动画,让我把这段代码拷贝到实际项目中时,意想不到的结果发生了

问题现象:

动画只有物体移动生效了,颜色变化没有生效

问题原因:

本质原因不明,经过自己研究调试发现是因为自己实际项目中用了qss,只要.setStyleSheet了后,就会与QGraphicsView的背景颜色动画产生冲突

解决方法

搞了大概一天,第二天来重整思绪。

自己回顾代码发现

self.scene = QGraphicsScene(self)
self.scene.setSceneRect(0, 0, 300, 300)
self.scene.addItem(self.ball.pixmap_item)
self.setScene(self.scene)

物体移动是把对象添加到了场景中,而颜色变化,却是直接改变的QGraphicsView的颜色

于是我尝试着放弃改变QGraphicsView而去改变QGraphicsScene的颜色,就解决了!so,原本的这段代码:

class Myview(QGraphicsView):
def __init__(self):
super().__init__()
self._set_color(QColor(105, 105, 105))
self.iniAnimation() def _set_color(self, col):
self.palette = QPalette()
# self.palette.setColor(self.backgroundRole(), col)
self.palette.setBrush(self.backgroundRole(), col)
self.setPalette(self.palette) def iniAnimation(self):
self.anim2 = QPropertyAnimation(self, b'color')
self.anim2.setDuration(1000)
self.anim2.setStartValue(QColor(105, 105, 105))
self.anim2.setKeyValueAt(0.1, QColor(255, 255, 240))
self.anim2.setKeyValueAt(0.3, QColor(219, 225, 171))
self.anim2.setKeyValueAt(0.7, QColor(148, 214, 184))
self.anim2.setEndValue(QColor(86, 199, 170)) color = pyqtProperty(QColor, fset=_set_color)

应该改为(QGraphicsView改变颜色不生效,那么重写QGraphicsScene改变颜色即可):

class TcpBackgroudScene(QGraphicsScene):
def __init__(self, widget):
super(TcpBackgroudScene, self).__init__(widget) self.iniAnimation() def _set_color(self, col):
self.setBackgroundBrush(col) def iniAnimation(self):
"""动画"""
# 颜色动画
self.anim3 = QPropertyAnimation(self, b'color')
self.anim3.setDuration(1000)
self.anim3.setStartValue(QColor(105, 105, 105))
self.anim3.setKeyValueAt(0.1, QColor(255, 255, 240))
self.anim3.setKeyValueAt(0.3, QColor(219, 225, 171))
self.anim3.setKeyValueAt(0.7, QColor(148, 214, 184))
self.anim3.setEndValue(QColor(86, 199, 170)) color = pyqtProperty(QColor, fset=_set_color)

注意这里改变QGraphicsScene的背景方法为 self.setBackgroundBrush(col)

最后再self.anim3.start()即可启动动画了!并且能与stylesheet兼容!

pyqt5 QGraphicsView颜色动画问题(不兼容,运行不了动画)的更多相关文章

  1. Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行

    Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我的CDH5.15.1集群中,默 ...

  2. Android属性动画完全解析(上),初识属性动画的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...

  3. 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动用属性:animation-play-state:paused暂停,在微信和safari里设置paused无效,在QQ里是正常的

    这几天遇到了两个很奇葩的问题,终于找到原因,趁还记得解决方法,赶紧记下来: 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动可以用属性:animat ...

  4. UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法

    基本的动画构成共有四种:透明动画/旋转动画/移动动画/缩放动画. 配置动画的方式有两种,一种是直接使用代码来配置动画效果,另一种是使用xml文档配置动画效果 相比而言,用xml文档写出来的动画效果,写 ...

  5. android动画具体解释六 XML中定义动画

    动画View 属性动画系统同意动画View对象并提供非常多比view动画系统更高级的功能.view动画系统通过改变绘制方式来变换View对象,view动画是被view的容器所处理的,由于View本身没 ...

  6. 自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画

    前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: <Android自己定义控件三部曲文章索引>: http://blog.csdn.net/harvic880925/article/det ...

  7. Unity中的动画系统和Timeline(3) 模型和动画导入

    动画导入 美工做好的模型,直接将文件夹拖进来就导入好了.导入模型后,检查模型的材质贴图等是否丢失,若丢失,根据名字补上.如果美工取名规范,一一对应的话,就很简单.如果不是,那就呵呵哒. 有的美工做的比 ...

  8. 【Flutter 实战】17篇动画系列文章带你走进自定义动画

    老孟导读:Flutter 动画系列文章分为三部分:基础原理和核心概念.系统动画组件.8篇自定义动画案例,共17篇. 动画核心概念 在开发App的过程中,自定义动画必不可少,Flutter 中想要自定义 ...

  9. 如何实现微信小程序动画?添加到我的小程序动画实现详细讲解,轻松学会动画开发!附壁纸小程序源码下载链接

    为了让用户能尽可能多地使用小程序,也算是沉淀用户,现在很多小程序中,都有引导用户"添加到我的小程序"的操作提示,而且大多都是有动画效果.在高清壁纸推荐小程序首页,用户每次进入,都会 ...

随机推荐

  1. oracle维护数据的完整性

    介绍: 数据的完整性用于确保数据库数据遵从一定的商业的逻辑规则.在oracle中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的 ...

  2. iOS 代码开发规范

    最近公司因为业务增多,又招了一个iOS小伙伴,内心无比开心呀.但是多了一个人,日常代码开发就要统一规范起来,方便日后维护和查找.下边列一下我日常用到一些代码规范. (一).SVN规范 1.代码一定要先 ...

  3. 201621123040《Java程序设计》第2周学习总结

    1.本周学习总结 关键词:Java中的字符串与数组 c语言基本语法的迁移 相关总结:在一周的学习过程中,我自主学习Java的基本语法,前期的相关语法与c语言的基本语法相近,也算是做到了很好的回顾:在郑 ...

  4. Alpha冲刺Day5

    Alpha冲刺Day5 一:站立式会议 今日安排: 首先由于经过黄腾飞短暂的测试,发现导入导出仍然有一些问题,今天需要进行完善 由黄腾飞负责企业自查风险管理子模块,要求为单元进行风险点的管理 由张梨贤 ...

  5. 【iOS】swift-ObjectC 在iOS 8中使用UIAlertController

    iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...

  6. 第八条:覆盖equals时请遵守通用约定

    ==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...

  7. Telnet、SSH和VNC 区别

    Telnet Telnet是进行远程登录的标准协议,它是当今Internet上应用最广泛的协议之一.它把用户正在使用的终 端或计算机变成网络某一远程主机的仿真终端,使得用户可以方便地使用远程主机上的软 ...

  8. Win10安装Ubuntu14.04.5双系统(显示器为DP接口)

    系统安装主要参考了这篇博文Win10+Ubuntu17.04双系统安装,不再重复. 重点说说DP接口的事,如果主机有VGA接口的话可以到此为止了,如果只有DP接口的话可以参考以下内容. 一.Ubunt ...

  9. python 单例模式的四种创建方式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  10. kafka和mqtt的区别是什么?

    两者都是从传统的Pub/Sub消息系统演化出来的,但是进化方向不一样,比较如下: Kafka是为了数据集成的场景,与以往Pub/Sub消息总线不一样,通过分布式架构提供了海量消息处理.高容错的方式存储 ...