Qt基于定时器实现动图展示效果

本文实例为大家分享了Qt基于定时器实现动图展示的具体代码,供大家参考,具体内容如下

总体概述

(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_OBJECT

public:
 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_OBJECT

public:
 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();
}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    Qt多线程 我们之前的程序都是单线程运行,接下来我们开始引入多线程.就相当于以前的一个人在工作,现在多个人一起工作. Qt中非常有必要使用多线程,这是因为,Qt应用是事件驱动型的,一旦某个事件处理函数处理时间过久,就会造成其它的事件得不到及时处理. Qt中使用QThread来管理线程,一个QThread对象,就是一个线程.QThread对象也有消息循序exec()函数,用来处理自己这个线程的事件. Qt实现多线程有两种方式 ​1.Qt第一种创建线程方式 首先要继承QThread 重写虚函数QTh

  • Qt定时器和随机数详解

    环境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1 一.定时器 Qt中有两种方法来使用定时器,一种是定时器事件,另一种是使用信号和槽.一般使用了多个定时器时最好使用定时器事件来处理. 1.新建Qt Gui应用,项目名称为myTimer,基类选择QWidget,类名为Widget. 2.到widget.h文件中添加函数声明: protected:     void timerEvent(QTimerEvent *); 然后添加私有变量定义: int id1, id

  • Qt基于定时器实现动图展示效果

    本文实例为大家分享了Qt基于定时器实现动图展示的具体代码,供大家参考,具体内容如下 总体概述 (1)总体介绍 动图展示主要是将已有的动图逐帧图片连续输出,达到视觉上的动态图效果,本次介绍两例,分别为单一动图和分组动图. 主要原理是设置一个定时器,然后随设置的秒数将资源中的逐帧图片输出,让图片连续变化. (2)素材获得途径 关于素材来源,可以到网站下载现成的逐帧图片素材包,也可以找到自己喜欢的动态图,通过软件(如:爱奇艺万能播放器)将动图逐帧保存得到素材. (注意:不论通过哪种方式获得素材,都需要

  • 基于jquery的手风琴图片展示效果实现方法

    本文实例讲述了基于jquery的手风琴图片展示效果实现方法.分享给大家供大家参考.具体实现方法如下: 代码运行效果如下图所示: index.html页面代码如下: 复制代码 代码如下: <!DOCTYPE html> <html class=''> <head>     <title>一款基于jquery的手风琴图片展示效果demo</title>     <style class="cp-pen-styles">

  • Android列表动图展示的实现策略

    前言 在最近的时间里,短视频流行了起来,随着这股潮流,一种动图封面的设计也被很多短视频app采用: 某音 而在app中,动图的展示是比较消耗性能的操作,对于这种一页非常多的动图在展示时需要做对应的处理,今天我结合自己在项目中处理的经验分享一下多动图的处理策略. 图片加载框架选择 对于动图的加载,尤其是webp格式的动图,Fresco真是不二的选择,而且fresco本身对内存的处理也很棒,本文是基于Fresco 1.0.10版本,如果使用低版本Fresco出现无解的问题时,不妨可以试着升级Fres

  • 基于jQuery实现动态数字展示效果

    我们在一些应用中需要动态展示数据,比如当前在线人数,当前交易总额,当前汇率等等,前端页面需要实时刷新获取最新数据.本文将结合实例给大家介绍使用jQuery实现动态数字展示效果. 查看演示 下载源码 HTML代码 本例假设要在页面上动态展示(无需刷新整个页面,只是局部刷新动态数字)当前在线用户数,常见在一些统计平台上应用.在HTML页面中只需定义以下结构: <div class="count">当前在线:<span id="number"> &

  • Android仿微信微博多图展示效果

    1.简介 这是一个用于实现像微信朋友圈和微博的类似的九宫格图片展示控件,通过自定义viewgroup实现,使用方便. 多图根据屏幕适配,单张图片时需要自己指定图片的宽高: 2.使用方法 引用: compile 'com.w4lle.library:NineLayout:1.0.0' 使用: 在项目的layout文件中添加如下xml即可加入到布局文件 <com.w4lle.library.NineGridlayout android:layout_marginTop="8dp" a

  • jquery picswitch图片焦点图展示效果

    效果如下:这个插件的要点之处就在JQuery-1.4.2.js的发布添加的新函数data的应用,所以jquery库一定要是1.4.2的版本 另一方面就是css的编写,setInterval和setTimeout的用法,前者是每隔多长时间执行一次,后者是多长时间执行一次: 关于setTimeout的用法 有二种形式 1 setTimeout(code,interval) 中的code是字符串 2 setTimeout(func,interval,args) 中的func是函数 实现代码 jquer

  • Qt实现炫酷启动图动态进度条效果

    目录 一.简述 二.动效进度条 1.光效进度条 2.延迟到达进度条 3.接口说明 三.启动图 1.实现思路 2.背景图切换 四.测试 1.构造启动图 2.背景图 3.其他信息 4.事件循环 五.源码 一.简述 最近接到一个新需求,让做一个动效进度条. 由于我们的产品比较大,在软件启动的时候会消耗比较长的时间,原生的进度条已经不能满足我们的需求,这里我们就需要一个会动的进度条,效果如下图所示. 光效进度条主要是做了一个进度动画,在已完成的部分上进行快速的迭代渲染,给用户一种直观感受,我们的软件一直

  • 基于Jquery实现焦点图淡出淡入效果

    本文实例讲述了基于Jquery实现焦点图淡出淡入效果代码.分享给大家供大家参考.具体如下: 这个容器用了百分比宽度,图片始终保持居中处理,定宽或者自适应宽度都是可以的. 兼容到IE6+以上浏览器,有淡出淡入速度和切换间隔两个参数可以改. 运行效果截图如下: 具体代码如下: Html代码如下: <!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8">

  • 基于BootStrap的图片轮播效果展示实例代码

    先给大家展示下bootstrap图片轮播图,效果如下所示,如果大家感觉效果还不错,请继续往下阅读,参考实现代码. 废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="

  • 微信小程序实现自动播放视频模仿gif动图效果实例

    需求背景: 在小程序页面插入gif动态图,但gif图一般体积比较大,转而用自动播放视频的模式来模拟gif图的效果,丰富页面展示.自动播放的视频,无控制条,无声音,自动循环播放. 技术难点: 因为微信小程序在同一个页面,存在多个视频时(建议不超过3个视频),会出现卡顿甚至闪退的情况. developers.weixin.qq.com/community/d- 方案: 参考小程序社区讨论方案,当视频未出现在屏幕可视区域时,用图片占位,出现在屏幕中,把图片替换成视频,并且自动播放. 代码注意点: vi

随机推荐