pyqt5 动画学习(四) 旋转动画,使用QGraphicsView让自己的控件旋转起来
今天学有所成,赶紧记下今天的成果
之前三篇文章分别演示了空间的大小改变,移动,及颜色变化。在后续研究旋转的过程中即为艰难
如果你是使用pyqt4,那么使用QGraphicsItemAnimation便可以轻松达到旋转的效果,这里不再详述
可惜到了pyqt5
于是查阅各种英文资料,我分别尝试了QGraphicsRotation,QGraphicsTransform,QTransform效果都不太理想,QTransform是可以实现的,但是太复杂
最后我找到了一种极为简单的方法就是在使用QGraphicsView的各种item时,可以直接setRotation让对象旋转起来,下面来看看代码,这里直接在对象上写一个动画:
class Ball(QObject):
def __init__(self):
super().__init__()
pixmap = QPixmap("../star.png")
scaledPixmap = pixmap.scaled(50, 55)
self.animation() self.pixmap_item = QGraphicsPixmapItem(scaledPixmap)
self.pixmap_item.setTransformOriginPoint(25, 27.5) # 设置中心为旋转
self._set_pos(QPointF(5, 30)) # 设置图标的初始位置 def _set_pos(self, pos):
self.pixmap_item.setPos(pos) def _set_rotation(self, angle):
self.pixmap_item.setRotation(angle.x()) # 旋转度数 def animation(self):
self.anim = QPropertyAnimation(self, b'pos')
self.anim.setDuration(1000)
self.anim.setStartValue(QPointF(5, 30))
self.anim.setKeyValueAt(0.3, QPointF(144, 30))
self.anim.setKeyValueAt(0.5, QPointF(54, 90))
self.anim.setKeyValueAt(0.8, QPointF(240, 250))
self.anim.setEndValue(QPointF(300, 60)) self.anim2 = QPropertyAnimation(self, b'rotation')
self.anim2.setDuration(1000)
self.anim2.setStartValue(QPointF(0, 1))
self.anim2.setEndValue(QPointF(360, 1)) pos = pyqtProperty(QPointF, fset=_set_pos)
rotation = pyqtProperty(QPointF, fset=_set_rotation)
这里可以看到我用QpointF把数字传进去,然后再取angle.x()作为度数,这样对象就可以旋转了
下面我对对象进行了加工,结合前面几篇动画文章,我做了一个按一定轨迹自转的动画。
这里使用了QGraphicsView界面,我们可以通过QGraphicsView这个界面创建各种QGraphicsScene场景,然后就可以把各种对象弄到这个场景里面去,非常方面
#!/usr/bin/python3
# -*- coding: utf-8 -*- """
Author: semishigure
Website: zetcode.com
Last edited: 2018.03.09
""" 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__()
pixmap = QPixmap("../star.png")
scaledPixmap = pixmap.scaled(50, 55)
self.animation() self.pixmap_item = QGraphicsPixmapItem(scaledPixmap)
self.pixmap_item.setTransformOriginPoint(25, 27.5) # 设置中心为旋转
self._set_pos(QPointF(5, 30)) # 设置图标的初始位置 def _set_pos(self, pos):
self.pixmap_item.setPos(pos) def _set_rotation(self, angle):
self.pixmap_item.setRotation(angle.x()) # 旋转度数 def animation(self):
self.anim = QPropertyAnimation(self, b'pos')
self.anim.setDuration(1000)
self.anim.setStartValue(QPointF(5, 30))
self.anim.setKeyValueAt(0.3, QPointF(144, 30))
self.anim.setKeyValueAt(0.5, QPointF(54, 90))
self.anim.setKeyValueAt(0.8, QPointF(240, 250))
self.anim.setEndValue(QPointF(300, 60)) self.anim2 = QPropertyAnimation(self, b'rotation')
self.anim2.setDuration(1000)
self.anim2.setStartValue(QPointF(0, 1))
self.anim2.setEndValue(QPointF(360, 1)) pos = pyqtProperty(QPointF, fset=_set_pos)
rotation = pyqtProperty(QPointF, fset=_set_rotation) 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.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) class MainWindow(Myview): def __init__(self):
super().__init__() self.initView()
self.iniui() def initView(self):
self.ball = Ball()
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.maingrid = QHBoxLayout()
self.maingrid.addStretch(1)
self.maingrid.addWidget(self.btn)
self.btn.clicked.connect(self.runAnim) self.maingrid2 = QVBoxLayout()
self.maingrid2.addStretch(1)
self.maingrid2.addLayout(self.maingrid) self.setLayout(self.maingrid2) def runAnim(self):
self.ball.anim.start()
self.ball.anim2.start()
self.anim3.start() if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
sys.exit(app.exec_())
界面效果:

备注:
让我们创建好QGraphicsView后,需要再创建一个QGraphicsScene场景,然后通过self.scene.addItem(self.ball.pixmap_item)把对象添加到场景里面,最后再通过self.setScene(self.scene)把场景添加进界面即可
pyqt5 动画学习(四) 旋转动画,使用QGraphicsView让自己的控件旋转起来的更多相关文章
- iOS动画学习 -隐式动画
事务 Core Animation基于一个假设,说屏幕上的任何东西都可以(或者可能)做动画.你并不需要在Core Animation中手动打开动画,但是你需要明确地关闭它,否则它会一直存在. 当你改变 ...
- AppleWatch___学习笔记(二)UI布局和UI控件
1.UI布局 直接开发,你会发现Apple Watch并不支持AutoLayout,WatchKit里有个类叫做WKInterfaceGroup,乍一看像是UIView,但是这货其实是用来布局的.从 ...
- WPF学习(三)--Menu、TabControl和DataGrid控件介绍
Menu Menu提供了菜单栏方式的多级菜单的管理和操作: 这里对Menu的样式不做任何的定制和管理 下面来对Menu进行测试: 将Menu添加到页面中 运行后,效果如下: 这里没有考虑界面效果和样式 ...
- Android学习之基础知识五—Android常用的七大控件
一.TextView控件:在界面上显示一段文本信息 先看XML代码和执行效果: 代码分析: 1.android:id属性,给当前控件定义了一个唯一的标识符 2.android:layo ...
- 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- android使用篇(四) 注解依赖注入IOC实现绑定控件
在android使用篇(三) MVC模式中提到一个问题: 1) 视图层(View):一般採用XML文件进行界面的描写叙述,使用的时候能够很方便的引入,可是用xml编写了,又须要在Acitvity声明而 ...
- Android动画学习(一)——Android动画系统框架简介
2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...
- MFC学习 标签页与属性页及各常用控件使用
参考 http://blog.csdn.net/anye3000/article/details/6700023 CTabCtrl: BOOL CTabTestDlg::OnInitDialog() ...
- 四、Socket之UDP异步传输文件-用控件显示文件传输进度
上一篇文章三.Socket之UDP异步传输文件中,实现了多文件的传输和MD5校验,还显示了文件传输过程中的信息,在这一篇文章中,将介绍怎样实现传输文件的进度显示和实现选择保存文件路径. 首先,来实现一 ...
随机推荐
- 漫谈Java IO之 Netty与NIO服务器
前面介绍了基本的网络模型以及IO与NIO,那么有了NIO来开发非阻塞服务器,大家就满足了吗?有了技术支持,就回去追求效率,因此就产生了很多NIO的框架对NIO进行封装--这就是大名鼎鼎的Netty. ...
- python爬虫遇到状态码304,705
304状态码是什么? 如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码.简单的表达就是:客户端已经 ...
- 个人作业2:QQ音乐APP案例分析
APP案例分析 QQ音乐 选择理由:毕竟作为QQ音乐九年的资深老用户以及音乐爱好者 第一部分 调研 1.第一次上手的体验 我算是很早期的QQ音乐的用户,用QQ音乐七八年,除了体验各方面还不错之外 ...
- 《Language Implementation Patterns》之 解释器
前面讲述了如何验证语句,这章讲述如何构建一个解释器来执行语句,解释器有两种,高级解释器直接执行语句源码或AST这样的中间结构,低级解释器执行执行字节码(更接近机器指令的形式). 高级解释器比较适合DS ...
- python 单向链表实现
单链表的操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 inse ...
- SWFUpload文件上传详解
SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大. SWFUpload的特点: 1.用flash进行上传,页面无刷新,且可自定义Flash按钮的样式; 2.可以在浏览器 ...
- HTTP协议以及HTTP2.0/1.1/1.0区别
HTTP协议以及HTTP2.0/1.1/1.0区别 一.简介 摘自百度百科: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所 ...
- nyoj 第几是谁
第几是谁? 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有"abcdefghijkl"12个字符,将其按字典序排列,如果给出任意一种排列, ...
- python使用tesseract-ocr完成验证码识别(安装部分)
一.tesseract-ocr安装 Ubuntu版本: 1.tesseract-ocr安装 sudo apt-get install tesseract-ocr 2.pytesseract安装 sud ...
- CentOS7 防火墙firewalld详细操作
1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disab ...
