我正在尝试在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?
答案 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);
}