Qt中的GIF动画

31

我使用了 QGraphicsViewQGraphicsScene 类来在小部件中展示一张图片,代码如下:

m_Scene->addPixmap(QPixmap(fileName));
m_View->setScene(m_Scene);

如何在同一个场景中显示.gif动画?

5个回答

84

我不会在QGraphicsViewQGraphicsScene中使用GIF动画,我只在QDialog中使用它,但我认为它们是相同的东西,所以这里是我的代码:

QMovie *movie = new QMovie(":/images/other/images/16x16/loading.gif");
QLabel *processLabel = new QLabel(this);
processLabel->setMovie(movie);
movie->start();

我从这个链接中获取了loading.gif


顺便提一句,也可以查看Qt SDK中的示例。它们真的可以帮助你!


14
如果有人问你5x5等于多少,你会说:“别问5x5等于多少,你最好问2x2等于多少?” 然后你回答:“2x2等于4”? - Narek
是的,这里的情况一样!你建议我通过知道2x2=4来计算5x5 :)))。我想感谢你的帮助,但你所说的我已经知道了,我想按照我提出的要求完成任务。也许你可以通过使用QGraphicsView和QGraphicsScene类来帮助我吗?或者如果你说用这些类不可能实现,那也是一个答案! - Narek
正如我之前提到的,我没有最终解决方案,而且我真的不知道QGraphicsView类是否支持GIF动画。但是你仍然可以使用其他方法,例如创建另一个QThread,它将在主窗口顶部显示GIF动画,同时您的应用程序加载场景或其他内容...哦,还是3x3? - mosg
+1 赞同并接受您的答案,因为这似乎是唯一的方法。 - Narek

27

我把这个放在这里,以防其他人遇到同样的问题。

问题

GIF图像无法加载,并且isValid()返回false

代码

// Load animated GIF
QMovie* movie = new QMovie("foo.gif");

// Make sure the GIF was loaded correctly
if (!movie->isValid()) 
{
    // Something went wrong :(
}

// Play GIF
QLabel* label = new QLabel(this);
label->setMovie(movie);
movie->start(); 

解决方法

为了解决这个问题,我不得不将Qt的GIF插件qgif4.dll放到名为imageformats的文件夹中,与我的exe文件在同一目录下才能使用GIF。

该dll文件可以在/plugins/imageformats/qgif4.dll中找到。


4
isValid() 对于调试非常有帮助,谢谢,为此点赞(+1)。 - Neurotransmitter

2

http://doc.qt.io/qt-5/qmovie.html

谷歌和Qt文档是您的好朋友。甚至有一个示例

PS:除非您在中国,否则无法访问谷歌,但您可以使用Bing和doc.qt.io.com等工具。

PS2:对于更深入的答案:您可以使用QGraphicsProxyWidget中的QLabel,该标签通过QLabel :: setMovie具有QMovie。可能有更简单/更短的方法来完成此操作。


1
请提供正确的资源路径,如下所示代码。
QMovie *movie=new QMovie(":/images/foo.gif");
if (!movie->isValid()) 
    {
     // Something went wrong :(
    }

// Play GIF
label=new QLabel(this);
label->setGeometry(115,60,128,128);
label->setMovie(movie);
movie->start();

0

尝试使用正确的图像路径:

 QMovie *movie = new QMovie(":/images/mygif.gif");
 movie->setVisible(true);
 QLabel *processLabel = new QLabel(this);
 processLabel->setGeometry(200,150,180,100);
 processLabel->setVisible(true);
 processLabel->setMovie(movie);
 movie->start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接