目录

  • 总体概述
    • (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例)相关推荐

  1. 【转载】(Git)用动图展示10大Git命令

    1.说明 git merge.git rebase.git reset.git revert.git fetch.git pull.git reflog-- 你知道这些 git 命令执行的究竟是什么任 ...

  2. 可视化展示——实现论文引用关系动图展示

    实现论文引用关系动图展示 效果 代码: 遇到的问题: 将队友获取的year,venues文件导入django: 解决时间选择器不显示问题: 效果 实现将队友处理好的用pyecharts展示出来的论文引 ...

  3. Qt—绘图与定时器(制作动图)

    绘图使用画家类QPainter void Dialog::paintEvent(QPaintEvent *event) {QPainter painter(this);//在此文本框绘图//前两个参数 ...

  4. 动图展示 10 大 Git 命令

    git merge.git rebase.git reset.git revert.git fetch.git pull.git reflog--你知道这些 Git 命令执行的究竟是什么任务吗?如果你 ...

  5. 这个神了,一目了然,确实好,看小姐姐用动图展示10大Git命令

    选自dev.to  作者:Lydia Hallie 机器之心编译  参与:Panda.杜伟 git merge.git rebase.git reset.git revert.git fetch.gi ...

  6. 小姐姐用动图展示 10 大 Git 命令,包你看完过目不忘!

    git merge.git rebase.git reset.git revert.git fetch.git pull.git reflog--你知道这些 git 命令执行的究竟是什么任务吗?如果你 ...

  7. #转载:十大排序方法,动图展示

    一像素 </div><div id="navigator"> 博客园 首页 新随笔 联系 订阅 管理 <div class="blogSta ...

  8. 经验 | 一目了然,用动图展示 10 大 Git 命令

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :机器之心 AI博士笔记系列 ...

  9. 只看当前分支_看小姐姐用动图展示10大Git命令

    (给机器学习算法与Python学习加星标,提升AI技能)选自dev.to本文授权转自"机器之心"(almosthuman2014) git merge.git rebase.git ...

最新文章

  1. Spring Security 实战干货:自定义异常处理
  2. Docker部署Jmeter 性能监控服务(常用命令)
  3. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.6. 布尔类型
  4. AlphaGo之父哈萨比斯: 先解决智能 再用智能解决一切
  5. ajax从mysql提取数据在html中_提取图片中数据的科研利器
  6. HTML之二:body标记的属性及属性值
  7. Linux查看内存占用--free
  8. flask如何查询mysql_bootstrap+flask+mysql实现网站查询
  9. 第一天 echo test (()) [[]]
  10. EF6 Codefirst+MySql 数据库迁移
  11. phpstudy和php,phpstudy和wamp哪个好
  12. cmd下批量pingIP地址
  13. 【Linux】进程终止与进程等待/僵尸进程与孤儿进程
  14. 电影后台管理系统(实训)
  15. Spring Security技术栈开发企业级认证与授权-笔记
  16. 网络协议之:基于 UDP 的高速数据传输协议 UDT
  17. Matlab画星座图
  18. word选中所有图形
  19. 2021年11月14日
  20. C语言快速排序(郝斌老师笔记)

热门文章

  1. 简单易用的运动控制卡(十一):运动的暂停恢复和速度倍率设置
  2. 如何使用电视或遥控器来控制Apple TV
  3. 利用MATLAB进行数据的批量拟合和预测
  4. 【c++实验一】CMatrix类设计与实现
  5. Java职业发展和成长路径
  6. Jitsi 开源视频会议远程桌面共享文档共享工具
  7. python字符串解密代码_几种字符串加密解密的方法
  8. SQL2000表里仅有几百条数据,查询很慢,可能跟锁有关
  9. 在linux下安装aapt/apktool
  10. android 剪切板监听_安卓监听剪切复制粘贴事件实例