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 都测试过。

http://www.qtdebug.com/qt-gif/

最新文章

  1. 扩大ubuntu虚拟机硬盘空间
  2. DXUT源码阅读笔记
  3. 使用cygwin出现syntax error near unexpected token&#39;$&#39;do\r
  4. Xcode 插件失效的临时解决方案
  5. Python strip、lstrip和rstrip的用法
  6. MVC&amp;WebForm对照学习:文件下载
  7. 语法:MySQL中INSERT INTO SELECT的使用(转)
  8. HTML5学习(六)---------SVG 与Canvas
  9. 嵌入式Linux系统运行流程图
  10. android 06 LinearLayout
  11. asp.net跨域上传文件
  12. 软件測试系统文章(文件夹&amp;amp;链接在此)
  13. Windows下WordPress搭建博客过程
  14. Cannot load browser &quot;PhantomJS&quot;: it is not registered! Perhaps you are missing some plugin? 测试安装遇到的BUG
  15. frp 初探
  16. jenkins中通过execute shell启动的进程会被杀死的问题
  17. codeforces510B
  18. Linux - iptable 限制 IP 访问端口
  19. 转载收藏用&lt;meta name=&quot;ROBOTS&quot;
  20. hdoj1175 连连看(dfs+剪枝)

热门文章

  1. jquery-12 折叠面板如何实现(两种方法)
  2. js,jquery遍历数组,对象
  3. DisplayPageBoundaries 打开word后自动将页面间空白隐藏 (auto+定时器)
  4. JAVA生成二维码并转化为二进制在页面展示
  5. php实现 合并表记录(需求是最好的老师)
  6. [HTML5] Focus management using CSS, HTML, and JavaScript
  7. NSString与int和float的相互转换
  8. Wpf的布局舍入属性(可以解决软件字体模糊的问题)
  9. 【t073】&&【t015】魔法物品
  10. 【Dijkstra+邻接表求次短路】POJ Sightseeing 3463