使用QMovie在QIF动画和Qt

时间:2016-06-07 02:10:53

标签: c++ qt animation

我正在尝试在Qt中使用QMovie来播放两个GIF。 当一个gif结束时,我需要播放下一个。

这就是问题所在。我想将信号连接到插槽,以便知道GIF动画何时结束。以下是我的代码示例:

#include "abv.h"
#include "ui_abv.h"
#include "qmovie.h"
#include "qlabel.h"
#include <iostream>
#include <QString>
#include <QDebug>
#include <QObject>

using namespace std;

abv::abv(QWidget *parent) :
    QDialog(parent, Qt::FramelessWindowHint),
    ui(new Ui::abv)
{
    QString project = projectGifs();//projectGifs() is a function stated in my header that sends over a randomly selected gif
    QMovie* movie = new QMovie(project);
    if (!movie->isValid())
    {
        cout << "The gif is not valid!!!";
    }
    QLabel* label = new QLabel(this);
    QObject::connect(
                movie, SIGNAL(frameChanged(int)),
                this, SLOT(abv::abv()));//stop animation and get new animation
    label->setMovie(movie);
    movie->start();
}

void abv::detectEndFrame(int frameNumber)
{
    if(frameNumber == (movie->frameCount()-1))
    {
        movie->stop();
    }
}

abv::~abv()
{
    delete ui;
}

if(frameNumber == movie->frameCount()-1),我收到一条错误消息,指出该电影未获声明。它还指出left of '->framecount' must point to class/struct/union/generic type

movie->stop();也是如此:我似乎可以访问变量movie

由于同样的问题,我似乎无法用新的GIF取代我的电影。 我该如何解决?我应该寻找什么来插入新的动画GIF?

1 个答案:

答案 0 :(得分:1)

首先,要删除错误,只需在头文件中声明QMovie(我认为这是名为abv.h的文件)。

在你的.h:

private : 
    QMovie* _movie;

在.cpp中:

abv::abv(QWidget *parent) :
    QDialog(parent, Qt::FramelessWindowHint),
    ui(new Ui::abv)
{
    QString project = projectGifs();
    _movie = new QMovie(project); // this line changes
    ...        

现在,您将信号frameChanged(int)连接到构造函数abv::abv()。它不会起作用,因为:

  • 主要是,你的构造函数不能成为一个插槽;
  • 签名不一样(插槽必须以int作为参数,就像信号一样)

而且,你为什么这样做呢?每次向用户发送新图像时都会发出信号frameChanged(int)(!)。您目前正在告诉您的程序每次更改帧时都会启动新的GIF。你的代码不会以这种方式工作。

如果我理解得很清楚,您只需将信号QMovie::finished()连接到您将调用另一个GIF的插槽。您的QLabel也必须是类变量。像这样:

在你的.h:

private
    QMovie* _movie;
    QLabel* _label;

public slots :
    void startNewAnimation();

在.cpp中:

abv::abv(QWidget *parent) :
    QDialog(parent, Qt::FramelessWindowHint),
    ui(new Ui::abv)
{
    QString project = projectGifs(); //projectGifs() is a function stated in my header that sends over a randomly selected gif
    _movie = new QMovie(project);
    if (!_movie->isValid())
        cout << "The gif is not valid!!!";
    _label = new QLabel(this);
    QObject::connect(
                _movie, SIGNAL(finished()),
                this, SLOT(startNewAnimation())); //stop animation and get new animation
    _label->setMovie(_movie);
    _movie->start();
}

void abv::startNewAnimation()
{
    // here you need to call your new GIF
    // and then you just put it in your label

    // you can also disconnect the signal finished() if you want

    QString newGIF = projectGifs();
    _movie = new QMovie(newGIF);
    _label->setMovie(_movie);
}