时间轴QTimeLine
一个动画由多张静态图片组成,每一张静态图片为一帧。每隔一定时间显示一帧,如果时间间隔非常短的话,那这些静态图片就会构成一个连续影像,动画由此而来。QTimeLine提供了用于控制动画的时间轴,它在实现动画效果方面非常快速有用
import sys
from PyQt5.QtCore import QTimeLine
from PyQt5.QtWidgets import QApplication, QWidget, QLabel class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(600, 600) self.label = QLabel('Hello PyQt5', self)
self.label.move(-100, 100) self.timeline = QTimeLine(5000, self) # 实例化一个时间轴,持续时间为5秒
self.timeline.setFrameRange(0, 700) #设置帧率范围,该值表示在规定的时间内将要执行多少帧
self.timeline.frameChanged.connect(self.set_frame_func) #帧数变化时发出信号
#当动画开始后,帧数就会发生改变,每次帧数发生变化,就会发出frameChanged信号(该信号发送时附带当前所在帧数)
self.timeline.setLoopCount(0) # 传入0代表无限循环运行.传入正整数会运行相应次数,传入负数不运行
self.timeline.start() #启动动画 def set_frame_func(self, frame):#参数:接受到的帧数
self.label.move(-100 + frame, 100) if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
现在来重点说一下QTimeLine的状态,一共有以下三种:
- QTimeLine.NotRunning = 0
- QTimeLine.Running =2
- QTimeLine.Paused =1
在未开始或者运行结束时,QTimeLine就会处于NotRunning状态;当调用start()方法启动后,变为Running状态,期间QTimeLine会不断发出frameChanged信号;而当在运行中调用setPaused(True)让QTimeLine暂停的话,状态就会变为Paused。每当状态发生改变,QTimeLine都会发出stateChanged信号,我们可以根据该信号来判断动画所处的状态并作相应的处理
以下四个方法用于改变QTimeLine状态:
start():让QTimeLine进入Running状态。
stop():让QTimeLine进入NotRunning状态。
resume():让QTimeLine从Paused状态或者NotRunning状态转为Running状态,动画从当前帧继续(注意start()方法不是从当前帧继续,而是直接从头开始)。
setPaused():传入True,让QTimeLine进入Paused状态;传入False,让QTimeLine进入Running状态(传入False时QTimeLine的状态必须为Paused)。
import sys
from PyQt5.QtCore import QTimeLine
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QHBoxLayout, QVBoxLayout class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(600, 600) self.label = QLabel('Hello PyQt5', self)
self.label.move(-100, 100) self.timeline = QTimeLine(5000, self)
self.timeline.setFrameRange(0, 700)
self.timeline.frameChanged.connect(self.set_frame_func)
self.timeline.stateChanged.connect(lambda: print(self.timeline.state())) #状态变化时发出信号
#self.timeline.state() 返回当前的状态
self.timeline.setLoopCount(0) self.start_btn = QPushButton('开始', self)
self.stop_btn = QPushButton('停', self)
self.pause_btn = QPushButton('暂停', self)
self.resume_btn = QPushButton('继续', self) self.start_btn.clicked.connect(self.timeline.start) #单击开始按钮
self.stop_btn.clicked.connect(self.timeline.stop) #单击停按钮
self.pause_btn.clicked.connect(lambda: self.timeline.setPaused(True)) #单击暂停按钮
self.resume_btn.clicked.connect(self.timeline.resume) #单击继续按钮 self.h_layout = QHBoxLayout()
self.v_layout = QVBoxLayout()
self.h_layout.addWidget(self.start_btn)
self.h_layout.addWidget(self.stop_btn)
self.h_layout.addWidget(self.pause_btn)
self.h_layout.addWidget(self.resume_btn)
self.v_layout.addStretch(1)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout) def set_frame_func(self, frame):
self.label.move(-100 + frame, 100) if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
最后我们再来说一下QTimeLine的方向概念,一共有两种方向:
QTimeLine.Forward (默认方向)
QTimeLine.Backward
当为QTimeLine.Foward时,动画按照我们初始设定进行移动;而为QTimeLine.Backward时,我们可以实现一种动画反向的效果
import sys
from PyQt5.QtCore import QTimeLine
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QHBoxLayout, QVBoxLayout class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(600, 600) self.label = QLabel('Hello PyQt5', self)
self.label.move(-100, 100) self.timeline = QTimeLine(5000, self)
self.timeline.setFrameRange(0, 700)
self.timeline.frameChanged.connect(self.set_frame_func)
self.timeline.setLoopCount(0)
self.timeline.start() self.forward_btn = QPushButton('正向', self)
self.backward_btn = QPushButton('反向', self)
self.forward_btn.move(150, 0)
self.backward_btn.move(350, 0)
self.forward_btn.clicked.connect(lambda: self.change_direction_func(self.forward_btn))
self.backward_btn.clicked.connect(lambda: self.change_direction_func(self.backward_btn)) def set_frame_func(self, frame):
self.label.move(-100 + frame, 100) def change_direction_func(self, btn):
if btn == self.forward_btn:
self.timeline.setDirection(QTimeLine.Forward) #设置时间轴动画为正向
else:
self.timeline.setDirection(QTimeLine.Backward) #设置时间轴动画为反向 if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
时间轴QTimeLine的更多相关文章
- QT动画时间轴控制 QTimeLine
QTimeLine类提供用于控制动画的时间轴 比如控制进度条的增长,图片,窗口的旋转,平移等等 QTimeLine有一个frameChanged(int)信号 当调用QTimeLine::start( ...
- iOS之TimeLine(时间轴)的实现
这是一个关于OC时间轴的简单实现,我认为重要的是思路. 感谢作者:Cyandev 的文章<iOS 实现时间线列表效果>给的思路.这里先附上Objective-C的代码实现,有时间再去试试S ...
- 08. Web大前端时代之:HTML5+CSS3入门系列 ~ QQ空间时间轴
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 大前端系列,主要就是使用CSS3.0来实现,注释我已经打 ...
- [原创]首次制作JQueryUI插件-Timeline时间轴
特点: 1. 支持多左右滚动,左右拖动. 2. 时间轴可上下两种显示方式. 3. 支持两种模式的平滑滚动/拖动. 4. 行压缩(后续版本此处可设置是否开启,上传的代码不带这个功能). 5. 支持hov ...
- SmohanTimeLine.js 酷炫的时间轴效果
展示地址 点此下载 原文出处 一.参数说明 item : '.item', //项目元素 top : 30, //与下一行的间距 pointWidth : 22, //时间点宽度 cornerWidt ...
- jquery时间轴幻灯展示源代码
查看效果:http://hovertree.com/texiao/jquery/75/ 源代码下载:http://hovertree.com/h/bjaf/8jlpc2wu.htm 效果图如下: 代码 ...
- Timeline Portfolio - 时间轴作品集效果
这里分享一个超炫的时间轴展示作品集效果.设计师和前端开发人员可以借助这个效果来制作新颖的作品集和个人简历.时间轴专门用来呈现出年代的一系列事件.您可以把这种效果嵌入各种媒体,包括微博,视频和地图,并把 ...
- JQuery+HTML5+CSS3制作时间轴插件,支持响应式布局
一.效果图预览 (图一) (图二) 附注说明: 图一是浏览器宽度像素大于560px下的展示效果,图二是在浏览器宽度像素小于560px下的展现效果.使用的是CSS3的Media Query(媒体查询)实 ...
- 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!
前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...
随机推荐
- html的表格 table
創建表格: 每一個表格以table開始: 每一個表格行以tr開始: 每一個數據以td開始:td的內容可以文本.圖像.表格.表單.段落等. 表格邊框: border設置邊框的粗細,但無法設置行間距,也無 ...
- fatal error: matio.h: No such file or directory
http://blog.csdn.net/zziahgf/article/details/72900948 $ sudo apt-get install libmatio-dev 或源码安装: # 下 ...
- linux ACL权限
利用这两个指令就可以了: getfacl:获取某個文件的 ACL 设置 setfacl:设置某個文件的 ACL 规范 [root@study ~]# setfacl [-bkRd] [{-m|-x} ...
- BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]……a[j]中第k小的数是多少(1≤k ...
- BZOJ3456 城市规划(多项式求逆)
设f[i]为连通图的数量,g[i]为不连通图的数量,显然有f[i]=2i*(i-1)/2-g[i],g[i]通过枚举1所在连通块大小转移,有g[i]=Σf[j]*C(i-1,j-1)·2(i-j)*( ...
- 画删除线的方法,如何找替代方法,Deprecated注释
用@Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择.在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告. 那么相应的替代方法应 ...
- 线段树分治总结(线段树分治,线段树,并查集,树的dfn序,二分图染色)
闲话 stO猫锟学长,满脑子神仙DS 网上有不少Dalao把线段树分治也归入CDQ分治? 还是听听YCB巨佬的介绍: 狭义:只计算左边对右边的贡献. 广义:只计算外部对内部的贡献. 看来可以理解为广义 ...
- sprintf-%s的用法
@2018-9-19 sprintf-%s的用法 #include <stdio.h> #include <string.h> char string[] = "I ...
- IDEA集成有道翻译插件/maven帮助插件/mybatis插件
(一)IDEA集成有道翻译插件:https://www.cnblogs.com/a8457013/p/7814335.html 插件下载地址:http://plugins.jetbrains.com/ ...
- PHP去调用jenkins
背景说明:目前公司用到 jenkins(持续集成开源工具)更多情况下,通过配置,可以在gitlab上通过webhooks去调度jenkins 或者通过 jenkins管理后台,去手动执行“立即构建”去 ...