一个动画由多张静态图片组成,每一张静态图片为一帧。每隔一定时间显示一帧,如果时间间隔非常短的话,那这些静态图片就会构成一个连续影像,动画由此而来。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的更多相关文章

  1. QT动画时间轴控制 QTimeLine

    QTimeLine类提供用于控制动画的时间轴 比如控制进度条的增长,图片,窗口的旋转,平移等等 QTimeLine有一个frameChanged(int)信号 当调用QTimeLine::start( ...

  2. iOS之TimeLine(时间轴)的实现

    这是一个关于OC时间轴的简单实现,我认为重要的是思路. 感谢作者:Cyandev 的文章<iOS 实现时间线列表效果>给的思路.这里先附上Objective-C的代码实现,有时间再去试试S ...

  3. 08. Web大前端时代之:HTML5+CSS3入门系列 ~ QQ空间时间轴

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 大前端系列,主要就是使用CSS3.0来实现,注释我已经打 ...

  4. [原创]首次制作JQueryUI插件-Timeline时间轴

    特点: 1. 支持多左右滚动,左右拖动. 2. 时间轴可上下两种显示方式. 3. 支持两种模式的平滑滚动/拖动. 4. 行压缩(后续版本此处可设置是否开启,上传的代码不带这个功能). 5. 支持hov ...

  5. SmohanTimeLine.js 酷炫的时间轴效果

    展示地址 点此下载 原文出处 一.参数说明 item : '.item', //项目元素 top : 30, //与下一行的间距 pointWidth : 22, //时间点宽度 cornerWidt ...

  6. jquery时间轴幻灯展示源代码

    查看效果:http://hovertree.com/texiao/jquery/75/ 源代码下载:http://hovertree.com/h/bjaf/8jlpc2wu.htm 效果图如下: 代码 ...

  7. Timeline Portfolio - 时间轴作品集效果

    这里分享一个超炫的时间轴展示作品集效果.设计师和前端开发人员可以借助这个效果来制作新颖的作品集和个人简历.时间轴专门用来呈现出年代的一系列事件.您可以把这种效果嵌入各种媒体,包括微博,视频和地图,并把 ...

  8. JQuery+HTML5+CSS3制作时间轴插件,支持响应式布局

    一.效果图预览 (图一) (图二) 附注说明: 图一是浏览器宽度像素大于560px下的展示效果,图二是在浏览器宽度像素小于560px下的展现效果.使用的是CSS3的Media Query(媒体查询)实 ...

  9. 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!

    前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...

随机推荐

  1. 微信小程序开发4之form表单与弹出层

    第一 表单的提交和重置 第二 radio组件 第三 checkbox组件 第四 loading组件 第五 toast组件 第六 modal组件

  2. sorted 返回字典的所有键

  3. ZJOI2019 Day1游记

    退役吧垃圾 考的再烂还是要把自己捡起来 如果不想让自己的OI生涯就到这里止步的话 就给我滚去拿剩下的300分吧 浙江省前十六,学校前五,day1比别人差一百多分.如果这样还能进省队的话,我就成为传说了 ...

  4. php-扩展模块查找下载网址

    http://pecl.php.net/ 在该网页里面输入想要查找的扩展模块名 如: 搜索结果:

  5. 监控(3)进程通用shell

    #! /bin/bash proc_name="beam.smp" #进程名 proc_num() #查询进程数{ num=`ps -ef | grep $proc_name | ...

  6. 【洛谷P2384】最短乘积路径

    题目大意:给定 N 个点,M 条边的有向图,边有边权,求从 1 号顶点到 N 号顶点的最短乘积路径.(经过的路径乘积最小)结果对9987取模. 乘积会爆 long long ,同时由于 dij 算法的 ...

  7. ASP:连接Access数据库的方法及使用感受

    连接Access的方式有: 方式1: Set conn = Server.Createobject("ADODB.Connection")conn.open "drive ...

  8. 预测氨基酸替换的致病性及分子机制:MutPred工具的使用

    MutPred的功能是预测氨基酸替换后的致病性及其分子机制,旧版本见链接:http://mutpred1.mutdb.org/ 新版本更新为MutPred2,见网站链接:http://mutpred2 ...

  9. Kafka配置文件server.properties(三个版本)

    前言 其实每个版本都有些许改动,只不过改动大小而已,但是网上的教程都真的太老了,其实更新一下也费不了多少时间 0.9.0 # Licensed to the Apache Software Found ...

  10. WCF开发实战系列三:自运行WCF服务

    WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...