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 | 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 | 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 都測試過。