31

I have used QGraphicsView, QGraphicsScene classes in order to show a picture in a widget like this:

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

How I can show .gif animation in the same scene?

Angie Quijano
  • 4,167
  • 3
  • 25
  • 30
Narek
  • 38,779
  • 79
  • 233
  • 389

5 Answers5

84

I don't use GIF animation with QGraphicsView or QGraphicsScene, I use it only in QDialog, but I think it's the same stuff, so here is my code:

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

My loading.gif I took from this link.


PS: also check the examples from Qt SDK. They are really can help!

Ignitor
  • 2,907
  • 33
  • 50
mosg
  • 12,041
  • 12
  • 65
  • 87
  • 13
    If someone asks you how much is 5x5 you say: "Don't ask how much is 5x5, you better ask how much is 2x2"? And you answer: "2x2 = 4"? – Narek Jul 15 '10 at 07:31
  • Yes, here the same story! You suggest me to calculate 5x5 by knowing 2x2=4 :))). I want to say thank you for your help but what you say I knew, I wanted to accomplish the task as I asked. May be you could help me to do this by using QGraphicsView and QGraphicsScene classes? Or if you say that it is impossble with these classes then it would be an answer too! – Narek Jul 15 '10 at 08:29
  • As I mentioned above, I don't have the final solution, and I really don't know is `QGraphicsView` class supports GIF animation. But still you could use another methods, like to create another `QThread` which would just show at the top of your main window GIF animation, while you app load scene or what ever... Oh, or it's 3x3? – mosg Jul 15 '10 at 08:53
  • +1 up-vote and I accept your answer, because, seems, this is the only way. – Narek Jul 20 '10 at 17:07
27

I put this here in case someone other than me runs into the same problem.

Problem

The GIF would not load and isValid() returns false.

Code

// 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(); 

Solution

To solve this, I had to put Qt's GIF-plugin qgif4.dll in a folder named imageformats next to my exe to be able to use GIFs.

The dll can be found under /plugins/imageformats/qgif4.dll.

Adelost
  • 2,343
  • 2
  • 23
  • 28
2

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

google and Qt docs are your friend. There's even have an example.

PS: unless you're in China, then google is unaccessible, but you'd have stuff like Bing and doc.qt.io.com.

PS2: for a little more in-depth answer: you can use a QGraphicsProxyWidget of a QLabel which has a QMovie via QLabel::setMovie. There's probably an easier/shorter way to do it.

rubenvb
  • 74,642
  • 33
  • 187
  • 332
1

Give the proper path of resource look like as below code

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();
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Subrata Das
  • 135
  • 1
  • 12
0

Try with proper image path:

 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();
csgeek
  • 711
  • 6
  • 15