当前位置: 首页 > news >正文

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兼容!

 

转载于:https://www.cnblogs.com/semishigure/p/8486896.html

相关文章:

  • Java Eclipse和MyEclipse快捷键
  • linux 使用fdisk分区扩容,看介绍命令(未完)
  • 微信小程序—智能小蜜(基于智能语义解析olami开放平台)
  • SCCM 2016 分发.msi 软件
  • cnpm新建vue项目
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • Python_函数
  • POJ 2392 Space Elevator(多重背包,排序)
  • ubuntu17.04中启动tnsorboard过程
  • BZOJ3601 一个人的数论
  • 亚马逊推出FreeTime Android应用程序,开放适合儿童资源
  • SpaceX发射机密间谍卫星,系与美国防部签订的第一单合作
  • 无人机给你送餐了,快来签收!
  • 作为“云计算”的延伸,“雾计算”只是一种炒作吗?
  • RT-Thread的线程(任务)处理 rt_thread_create/rt_thread_init区别
  • “大数据应用场景”之隔壁老王(连载四)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Docker 笔记(2):Dockerfile
  • exports和module.exports
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • nodejs实现webservice问题总结
  • Phpstorm怎样批量删除空行?
  • sessionStorage和localStorage
  • vue--为什么data属性必须是一个函数
  • 关于Flux,Vuex,Redux的思考
  • 技术胖1-4季视频复习— (看视频笔记)
  • 精彩代码 vue.js
  • 前端js -- this指向总结。
  • 前端相关框架总和
  • 让你的分享飞起来——极光推出社会化分享组件
  • 深度学习入门:10门免费线上课程推荐
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 运行时添加log4j2的appender
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 我们雇佣了一只大猴子...
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (16)Reactor的测试——响应式Spring的道法术器
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)windows配置JDK环境
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十八)三元表达式和列表解析
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 成都线下面基会拉开序幕
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递