Qt基于定时器实现简单动图展示(2例)
目录
- 总体概述
- (1)总体介绍
- (2)素材获得途径
- (3)通用函数介绍
- ①绘图函数
- ②定时器事件
- 第一例:单一动图展示
- 第二例:分组动图展示
总体概述
(1)总体介绍
动图展示主要是将已有的动图逐帧图片连续输出,达到视觉上的动态图效果,本次介绍两例,分别为单一动图和分组动图。
主要原理是设置一个定时器,然后随设置的秒数将资源中的逐帧图片输出,让图片连续变化。
(2)素材获得途径
关于素材来源,可以到网站下载现成的逐帧图片素材包,也可以找到自己喜欢的动态图,通过软件(如:爱奇艺万能播放器)将动图逐帧保存得到素材。
(注意:不论通过哪种方式获得素材,都需要使图片的序号格式一致)
(3)通用函数介绍
①绘图函数
Qt中的paintEvent()函数是一个用于绘制图形的函数,这个函数需要添加头文件:
#include <QPainter>
同时paintEvent()函数需要在dialog.h文件中提前声明:
public:void paintEvent(QPaintEvent *);
需要注意的是,此函数不能主动调用,且不能把我们需要的绘图程序写在此函数外面。
②定时器事件
定时器事件主要用到timerEvent(),timerEvent是QDbejct所内置的事件,所有继承QDbejct的类都可以使用。
要运用timerEvent()需要在类中提前声明:
public:void timerEvent(QTimerEvent *);
此外,要产生timerEvent,就需要startTimer(dalaytime)方法,例如:
int eventID;eventID = startTimer(50);
第一例:单一动图展示
dialog.h文件:
class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void paintEvent(QPaintEvent *);void timerEvent(QTimerEvent *);int eventID;int curIndex;void InitPixmap();private:QPixmap pixmap[168];Ui::Dialog *ui;
};
头文件:
#include <QPainter>
#include <QPixmap>
将资源放入InitPixmap函数中:
void Dialog::InitPixmap(){for(int i=1;i<=168;i++){QString fileName = QString(":/res/picture/1(%1).png").arg(i+1,3,10,QLatin1Char('0'));QPixmap map(fileName);pixmap[i] = map;}
}
":/res/picture/1(%1).png"为图片的资源路径,且此处图片的编号需统一。
arg中的参数为:
arg(变量的值, 位数, 进制, 位数不够时补位的数);
定时器事件:
void Dialog::timerEvent(QTimerEvent *){curIndex++;if(curIndex >= 168) { curIndex = 0; }repaint();
}
绘图函数:
void Dialog::paintEvent(QPaintEvent *){QPainter painter(this);QRect q(0,0,450,357);QRect q2(50,50,450,357);painter.drawPixmap(q2,pixmap[curIndex],q);
}
关联函数:
Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);resize(600,600);eventID = startTimer(50);curIndex = 0;InitPixmap();
}
效果图:
第二例:分组动图展示
分组动图展示与单一动图展示大致相同,只是在绘图函数中将以放入的资源进行分组,将不同组图片同时不同位置输出。
dialog.h文件:
class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void paintEvent(QPaintEvent *);void timerEvent(QTimerEvent *);int eventID1;int curIndex;void InitPixmap();private:QPixmap pixmap[64];Ui::Dialog *ui;
};
头文件:
#include <QPainter>
#include <QPixmap>
将资源放入InitPixmap函数中:
void Dialog::InitPixmap(){for(int i=1;i<=64;i++){QString fileName = QString(":/res/picture/1_%1.png").arg(i+1,2,10,QLatin1Char('0'));QPixmap map(fileName);pixmap[i] = map;}
}
定时器事件:
void Dialog::timerEvent(QTimerEvent *){curIndex++;if(curIndex >= 8) { curIndex = 0; }repaint();
}
绘图函数:
void Dialog::paintEvent(QPaintEvent *){QPainter painter(this);
int i=0;i<8;i++){QRect q(0,0,80,91);QRect q2(2*80*i,100,2*80,2*91);painter.drawPixmap(q2,pixmap[curIndex+8*i],q);}
}
关联函数:
Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);resize(2*91*8,1024);eventID1 = startTimer(100);curIndex = 0;InitPixmap();
}
效果图:
Qt基于定时器实现简单动图展示(2例)相关推荐
- 【转载】(Git)用动图展示10大Git命令
1.说明 git merge.git rebase.git reset.git revert.git fetch.git pull.git reflog-- 你知道这些 git 命令执行的究竟是什么任 ...
- 可视化展示——实现论文引用关系动图展示
实现论文引用关系动图展示 效果 代码: 遇到的问题: 将队友获取的year,venues文件导入django: 解决时间选择器不显示问题: 效果 实现将队友处理好的用pyecharts展示出来的论文引 ...
- Qt—绘图与定时器(制作动图)
绘图使用画家类QPainter void Dialog::paintEvent(QPaintEvent *event) {QPainter painter(this);//在此文本框绘图//前两个参数 ...
- 动图展示 10 大 Git 命令
git merge.git rebase.git reset.git revert.git fetch.git pull.git reflog--你知道这些 Git 命令执行的究竟是什么任务吗?如果你 ...
- 这个神了,一目了然,确实好,看小姐姐用动图展示10大Git命令
选自dev.to 作者:Lydia Hallie 机器之心编译 参与:Panda.杜伟 git merge.git rebase.git reset.git revert.git fetch.gi ...
- 小姐姐用动图展示 10 大 Git 命令,包你看完过目不忘!
git merge.git rebase.git reset.git revert.git fetch.git pull.git reflog--你知道这些 git 命令执行的究竟是什么任务吗?如果你 ...
- #转载:十大排序方法,动图展示
一像素 </div><div id="navigator"> 博客园 首页 新随笔 联系 订阅 管理 <div class="blogSta ...
- 经验 | 一目了然,用动图展示 10 大 Git 命令
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟 报道 | 公众号 CVLianMeng 转载于 :机器之心 AI博士笔记系列 ...
- 只看当前分支_看小姐姐用动图展示10大Git命令
(给机器学习算法与Python学习加星标,提升AI技能)选自dev.to本文授权转自"机器之心"(almosthuman2014) git merge.git rebase.git ...
最新文章
- Spring Security 实战干货:自定义异常处理
- Docker部署Jmeter 性能监控服务(常用命令)
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.6. 布尔类型
- AlphaGo之父哈萨比斯: 先解决智能 再用智能解决一切
- ajax从mysql提取数据在html中_提取图片中数据的科研利器
- HTML之二:body标记的属性及属性值
- Linux查看内存占用--free
- flask如何查询mysql_bootstrap+flask+mysql实现网站查询
- 第一天 echo test (()) [[]]
- EF6 Codefirst+MySql 数据库迁移
- phpstudy和php,phpstudy和wamp哪个好
- cmd下批量pingIP地址
- 【Linux】进程终止与进程等待/僵尸进程与孤儿进程
- 电影后台管理系统(实训)
- Spring Security技术栈开发企业级认证与授权-笔记
- 网络协议之:基于 UDP 的高速数据传输协议 UDT
- Matlab画星座图
- word选中所有图形
- 2021年11月14日
- C语言快速排序(郝斌老师笔记)