Qt基于定時器實現(xiàn)動圖展示效果
本文實例為大家分享了Qt基于定時器實現(xiàn)動圖展示的具體代碼,供大家參考,具體內容如下
總體概述
(1)總體介紹
動圖展示主要是將已有的動圖逐幀圖片連續(xù)輸出,達到視覺上的動態(tài)圖效果,本次介紹兩例,分別為單一動圖和分組動圖。
主要原理是設置一個定時器,然后隨設置的秒數(shù)將資源中的逐幀圖片輸出,讓圖片連續(xù)變化。
(2)素材獲得途徑
關于素材來源,可以到網(wǎng)站下載現(xiàn)成的逐幀圖片素材包,也可以找到自己喜歡的動態(tài)圖,通過軟件(如:愛奇藝萬能播放器)將動圖逐幀保存得到素材。
(注意:不論通過哪種方式獲得素材,都需要使圖片的序號格式一致)
(3)通用函數(shù)介紹
①繪圖函數(shù)
Qt中的paintEvent()函數(shù)是一個用于繪制圖形的函數(shù),這個函數(shù)需要添加頭文件:
#include <QPainter>
同時paintEvent()函數(shù)需要在dialog.h文件中提前聲明:
public: void paintEvent(QPaintEvent *);
需要注意的是,此函數(shù)不能主動調用,且不能把我們需要的繪圖程序寫在此函數(shù)外面。
②定時器事件
定時器事件主要用到timerEvent(),timerEvent是QDbejct所內置的事件,所有繼承QDbejct的類都可以使用。
要運用timerEvent()需要在類中提前聲明:
public: void timerEvent(QTimerEvent *);
此外,要產(chǎn)生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函數(shù)中:
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"為圖片的資源路徑,且此處圖片的編號需統(tǒng)一。
arg中的參數(shù)為:
arg(變量的值, 位數(shù), 進制, 位數(shù)不夠時補位的數(shù));
定時器事件:
void Dialog::timerEvent(QTimerEvent *){
curIndex++;
if(curIndex >= 168) { curIndex = 0; }
repaint();
}繪圖函數(shù):
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);
}關聯(lián)函數(shù):
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
resize(600,600);
eventID = startTimer(50);
curIndex = 0;
InitPixmap();
}效果圖:

第二例:分組動圖展示
分組動圖展示與單一動圖展示大致相同,只是在繪圖函數(shù)中將以放入的資源進行分組,將不同組圖片同時不同位置輸出。
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函數(shù)中:
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();
}繪圖函數(shù):
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);
}
}關聯(lián)函數(shù):
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
resize(2*91*8,1024);
eventID1 = startTimer(100);
curIndex = 0;
InitPixmap();
}效果圖:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
windows下vscode環(huán)境c++利用matplotlibcpp繪圖
本文主要介紹了windows下vscode環(huán)境c++利用matplotlibcpp繪圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02

