gpt4 book ai didi

c++ - 使用 QMovie 在 GIF 动画和 Qt 中的信号/槽之间切换

转载 作者:行者123 更新时间:2023-11-28 05:38:30 46 4
gpt4 key购买 nike

我正在尝试在 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' 必须指向类/结构/union/泛型类型

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

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

最佳答案

首先,为了消除错误,只需在您的头文件中声明您的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);
}

关于c++ - 使用 QMovie 在 GIF 动画和 Qt 中的信号/槽之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37669446/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com