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

在一篇资料中了解到我们可以通过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中事务处理--事务隔离级别

    概念:隔离级别定义了事务与事务之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而以,不同的数据库在实现时有所不同). 隔离级别 脏读 ...

  2. git解决修改代码后无法push的问题failed to push some refs to 'ssh://git@xxx.xxx.xx/xx.git'

    今天在使用git提交代码的时候,犯了个很低级的错误,按照一切流程当我add并commit提交代码,最后使用push到远程仓库, 接下来奇怪的事情发生了,push之后,查看远程仓库代码并没有发现提交记录 ...

  3. C 连接mysql VC的步骤

    初学C,看到C 连接mysql的教程不是很多,遇到很多的问题,看过许多盟友的解决方法,有点模糊(对我这个菜鸟来说),下面贴出具体步骤,一起学习: 1.C连接mysql的方法:C ,C ++ ,ODBC ...

  4. 关于FPGA随笔

    verilog与c

  5. cord-in-a-box 2.0 安装指南

    [TOC] 这篇文章简要介绍了 Ciab2.0 的安装. 包括硬件, 软件环境的选择, Ciab2.0的实际部署架构, 安装过程等. 下面就先对 Ciab2.0 部署环境做简要介绍. 1. 概述 这一 ...

  6. python 面向对象设计思想发展史

    这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来 ...

  7. java截取一个字符串正数或倒数某个特定字符前后的内容

    取出正数第二个“.”后面的内容 public class TestCode { public static void main(String[] args) { String str ="2 ...

  8. Java 持久化之 --io流与序列化操作

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  9. 在WebStorm中启动Angular项目

    点击配置 创建 选择命令 package.json 运行 查看运行结果

  10. LDAP apacheds解决方案

    Apache DS 配置与管理   LADP基本介绍 LDAP(轻量级目录访问协议)以目录的形式来管理资源(域用户,用户组,地址簿,邮件用户,打印机等等).   特点: 1. LDAP是一种网略协议而 ...