Qt 顯示 GIF

https://qtdebug.com/qt-gif/

Qt 中,靜態圖片 PNG,JPG 等可以用其創建 QPixmap,調用 QLabel::setPixmap() 來顯示,但是能夠具有動畫的 GIF 卻不能這麼做,要在 QLabel 上顯示 GIF,需要藉助 QMovie 來實現。

QLabel 顯示 GIF

使用 GIF 圖片的路徑創建 QMovie 對象,並且調用 QMovie::start() 啓動 GIF 動畫,然後通過 QLabel::setMovie() 設置好動畫對象後,就能在 QLabel 上看到 GIF 動畫了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QApplication>
#include <QMovie>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QLabel *label = new QLabel();
QMovie *movie = new QMovie("/Users/Biao/Desktop/x.gif");
label->setMovie(movie); // 1. 設置要顯示的 GIF 動畫圖片
movie->start(); // 2. 啓動動畫
label->show();
return app.exec();
}

控制 GIF 動畫循環次數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <QApplication>
#include <QMovie>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QLabel *label = new QLabel();
QMovie *movie = new QMovie("/Users/Biao/Desktop/x.gif");
label->setMovie(movie); // 1. 設置要顯示的 GIF 動畫圖片
movie->start(); // 2. 啓動動畫
label->show();
QObject::connect(movie, &QMovie::frameChanged, [=](int frameNumber) {
// GIF 動畫執行一次就結束
if (frameNumber == movie->frameCount() - 1) {
movie->stop();
}
});
return app.exec();
}

如果查看 QMovie API,會發現 QMovie::loopCount() 能夠返回 GIF 動畫的循環次數,但是這個次數是創建 GIF 時設置的次數,QMovie 沒有提供 API 來設置動畫循環的次數,不過我們可以監聽動畫執行時的 frameChanged 信號,如果當前幀是 GIF 的最後一幀時則說明一次動畫播放完成,需要停止動畫播放時調用 QMovie::stop() 即可。上面的例子中 GIF 動畫執行完一次的時候就停止,如果需要執行完 3 次時才停止,應該怎麼修改呢?

QMovie 中 GIF 動畫幀的序號從 0 開始計數,例如共有 200 幀的 GIF 動畫的最後一幀的下標是 199,QMovie::frameCount() 返回 GIF 的幀數。

性能

QMovie 顯示 GIF 的性能還是非常強勁的,在項目中顯示一個 200 幀,50M 大小的 GIF,和顯示普通的圖片速度一樣非常快,沒有任何延遲的感覺,Mac 和 Windows 都測試過。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章