pyqt5 QGraphicsView颜色动画问题(不兼容,运行不了动画)
初学动画。无敌踩坑,资料真的是太少了。。。。。本坑是一个大坑,只有解决方法,但实质原因仍不清楚
在一篇资料中了解到我们可以通过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颜色动画问题(不兼容,运行不了动画)的更多相关文章
- Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行
Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我的CDH5.15.1集群中,默 ...
- Android属性动画完全解析(上),初识属性动画的基本用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...
- 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动用属性:animation-play-state:paused暂停,在微信和safari里设置paused无效,在QQ里是正常的
这几天遇到了两个很奇葩的问题,终于找到原因,趁还记得解决方法,赶紧记下来: 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动可以用属性:animat ...
- UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法
基本的动画构成共有四种:透明动画/旋转动画/移动动画/缩放动画. 配置动画的方式有两种,一种是直接使用代码来配置动画效果,另一种是使用xml文档配置动画效果 相比而言,用xml文档写出来的动画效果,写 ...
- android动画具体解释六 XML中定义动画
动画View 属性动画系统同意动画View对象并提供非常多比view动画系统更高级的功能.view动画系统通过改变绘制方式来变换View对象,view动画是被view的容器所处理的,由于View本身没 ...
- 自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画
前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: <Android自己定义控件三部曲文章索引>: http://blog.csdn.net/harvic880925/article/det ...
- Unity中的动画系统和Timeline(3) 模型和动画导入
动画导入 美工做好的模型,直接将文件夹拖进来就导入好了.导入模型后,检查模型的材质贴图等是否丢失,若丢失,根据名字补上.如果美工取名规范,一一对应的话,就很简单.如果不是,那就呵呵哒. 有的美工做的比 ...
- 【Flutter 实战】17篇动画系列文章带你走进自定义动画
老孟导读:Flutter 动画系列文章分为三部分:基础原理和核心概念.系统动画组件.8篇自定义动画案例,共17篇. 动画核心概念 在开发App的过程中,自定义动画必不可少,Flutter 中想要自定义 ...
- 如何实现微信小程序动画?添加到我的小程序动画实现详细讲解,轻松学会动画开发!附壁纸小程序源码下载链接
为了让用户能尽可能多地使用小程序,也算是沉淀用户,现在很多小程序中,都有引导用户"添加到我的小程序"的操作提示,而且大多都是有动画效果.在高清壁纸推荐小程序首页,用户每次进入,都会 ...
随机推荐
- Android实用代码七段(三)
正文 一.获取已经安装APK的路径 PackageManager pm = getPackageManager(); for (ApplicationInfo app : pm.getInstall ...
- 【Android】带进度条的WebView
http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html
- eclipse中svn的各种状态图标详解
- 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽略文件. A file ignored by version co ...
- SpringBoot03 项目热部署
1 问题 在编写springBoot项目时,经常需要修改代码:但是每次修改代码后都需重新启动,修改的代码才会生效 2 这么实现IDEA能够像Eclipse那样保存过后就可以自动进行刷新呢 将sprin ...
- [CentOS] SSH 免密钥登录
一.环境说明: 操作系统:CentOS-7-x86_64-Minimal-1611 虚拟机:VMware® Workstation 12 Pro:12.5.5 build-5234757 服务器:no ...
- 云服务器Windows Server2012 配置http服务器(又称Web服务器,IIS)
出错:无法打开运行空间池.服务器管理器WinRM插件可能已损坏或丢失. 解决方法: http://shiyousan.com/post/636308065767125916 第一步是开启WinRM服务 ...
- Java虚拟机之性能监控
一.jstat:虚拟机统计信息监控工具监视虚拟机各种运行状态 图中,S0.S1(Survivor0.Survivor1)代表两个Survivor区,其中一个值为57.60%.另一个为0.E(Eden) ...
- 第四次团队作业:社团申请App
概要: 基于上次软件设计本着界面简洁.易于使用的初衷,进行功能的实现,代码位置:https://github.com/LinZezhong/testDemo 第一部分:软件的使用 注册: 登录: 主界 ...
- C语言实现Linux命令——od
C语言实现Linux命令--od 实现要求: 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写M ...
- 1013团队Beta冲刺day3
项目进展 李明皇 今天解决的进度 完善了程序的运行逻辑(消息提示框等) 明天安排 前后端联动调试 林翔 今天解决的进度 向微信官方申请登录验证session以维护登录态 明天安排 继续完成维护登录态 ...