Search code examples
c++qtqt4qmovie

How to use the signal QMovie::frameChanged(int frameNumber) to emit a signal?


I want to use the frameChanged(int) to emit a signal when the currentFrameNumber is equal to the frameCount, my QT version is 4.7.4

QObject::connect(movie,SIGNAL(frameChanged(int)),movie,SLOT(stop()));

QMovieChild.cpp:

class QMovieChild:public QMovie
{

signals:
void newSignal();
public slots:
    void onFrameChanged(int frameNumber){
        if(frameNumber == this->frameCount()-2)
            emit newSignal();
}
};

Monster.cpp:

void Monster::Vanishment()
{
QMovieChild *movie = new QMovieChild();
movie->setFileName("./pikaqiu.gif");
QSize size = this->getLabelPointer()->size();
movie->setScaledSize(size);
this->getLabelPointer()->setMovie(movie);
QMovie::connect(movie,SIGNAL(newSignal()),movie,SLOT(deleteLater()));
QMovie::connect(movie,SIGNAL(frameChanged(int)),movie,SLOT(onFrameChanged(int)));
movie->start();
}

Solution

  • To create a signal the class should inherit from QObject, if the class you use is QWidget, it is also valid since it inherits from QObject.

    #ifndef QMOVIECHILD_H
    #define QMOVIECHILD_H
    
    #include <QMovie>
    
    class QMovieChild : public QMovie
    {
        Q_OBJECT
    public:
        QMovieChild(QObject * parent = 0):QMovie(parent){
            connect(this, SIGNAL(frameChanged(int)), this, SLOT(onFrameChanged(int)));
        }
    
    signals:
        void newSignal();
    private slots:
        void onFrameChanged(int frameNumber){
            if(frameNumber == frameCount()-1){
                emit newSignal(); 
                //stop();
            }
        }
    
    };
    
    #endif // QMOVIECHILD_H
    

    Use:

    QMovieChild *movie = new QMovieChild;
    movie->setFileName("./pikaqiu.gif");
    QMovie::connect(movie,SIGNAL(newSignal()),movie,SLOT(deleteLater()));
    QSize size = getLabelPointer()->size();
    movie->setScaledSize(size);
    getLabelPointer()->setMovie(movie);
    movie->start();