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();

}

效果图:

以上是 Qt基于定时器实现动图展示效果 的全部内容, 来源链接: utcz.com/z/335930.html

回到顶部