QT绘制动图
简述
用pixmap快速绘制一张张图片即可达到绘制动图的目的
效果图
代码实现
1.构造函数将动态图的分解图加载进数组
void Dialog::InitPixmap()
{
for(int i=0;i<248;i++)
{
QString fileName=QString(":/rec/pic_%28.GIF").arg(i+1,3,10,QLatin1Char('0'));
///rec/pic_%28.GIF 中的%28是代替变动的数字的;arg(i+1,3,10,QLatin1Char('0')中i+是指%28代指的是i+1;3是代表i+1是三位数,10是代表i+1是十进制,QLatin1Char('0')是指i+1中不满三位数的部分用0代替
QPixmap map(fileName);//将文件名传给map
pixmap[i]=map;//将map传入数组
}
}
2.绘制图片
void Dialog::paintEvent(QPaintEvent*event)
{
QPainter painter(this);
QRect q(0,0,211,113);//构造图片矩形
QRect q2(0,0,width(),height());//构造放置图片的矩形,我在这里将它设置为和窗口一样大
painter.drawPixmap(q2,pixmap[curIndex],q);
}//将pixmap[curIndex]的q部分画入到q2中
3.设置定时器及事件
startTimer(50);//每隔50毫秒调用一次timerEvent事件
void Dialog::timerEvent(QTimerEvent*event)
{
curIndex++;//每调用一次,变量就自加一
if(curIndex>=248)
curIndex=0;//当所有图片都放映后,将 curIndex归0,实现循环
repaint();//重新调用paintEvent事件,实现图片的更新
}
源代码
头文件 dialog.h:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
QPixmap pixmap[248];
void InitPixmap();
void timerEvent(QTimerEvent*event);
void paintEvent(QPaintEvent*event);//数组,自己构造的函数以及两个事件的声明
int curIndex;
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
cpp文件 dialog.cpp:
#include "dialog.h"
#include "ui_dialog.h"
#include <QPainter>
#include <QPixmap>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
resize(422,226);
startTimer(50);
InitPixmap();
curIndex=0;
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent*event)
{
QPainter painter(this);
QRect q(0,0,211,113);
QRect q2(0,0,width(),height());
painter.drawPixmap(q2,pixmap[curIndex],q);
}
void Dialog::timerEvent(QTimerEvent*event)
{
curIndex++;
if(curIndex>=248)
curIndex=0;
repaint();
}
void Dialog::InitPixmap()
{
for(int i=0;i<248;i++)
{
QString fileName=QString(":/rec/pic_%28.GIF").arg(i+1,3,10,QLatin1Char('0'));
QPixmap map(fileName);
pixmap[i]=map;
}
}
资源文件:
哪怕