Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QImageReader赢得';t形环,不可控_Qt_Loops_Gif_Qimage - Fatal编程技术网

Qt QImageReader赢得';t形环,不可控

Qt QImageReader赢得';t形环,不可控,qt,loops,gif,qimage,Qt,Loops,Gif,Qimage,这里的问题真快 我试图使用QImageReader读取Gif的帧,但是当动画完成时,它不会循环。我甚至无法控制加载哪个帧,因为使用ImageReader的read()函数返回QImage或使用QPixmap::fromImageReader()都会导致QImageReader自动跳转到下一帧。问题是,它们都使用相同的逻辑,如果在动画结束时,则只返回null而不是重置 以下是我尝试使用GIF的方式:我的类有一个QTimer和一个QImageReader。计时器超时时,我调用我的“nextFrame

这里的问题真快

我试图使用QImageReader读取Gif的帧,但是当动画完成时,它不会循环。我甚至无法控制加载哪个帧,因为使用ImageReader的read()函数返回QImage或使用QPixmap::fromImageReader()都会导致QImageReader自动跳转到下一帧。问题是,它们都使用相同的逻辑,如果在动画结束时,则只返回null而不是重置

以下是我尝试使用GIF的方式:我的类有一个QTimer和一个QImageReader。计时器超时时,我调用我的“nextFrame()”插槽


我一定是在问一些根本性的问题——有人能帮我吗?我甚至更新到了Qt的最新版本,但它并没有起到任何作用。这不是我尝试过的,但是
QImageReader
类有以下三种方法:

int currentImageNumber () const
对于支持动画的图像格式,此函数返回当前帧的序列号


对于支持动画的图像格式,此函数返回动画中的图像总数


对于支持动画的图像格式,此函数将跳转到序列号为
imageNumber
的图像


在我看来,使用前两种方法可以确定何时读取了动画的最后一帧,然后使用
jumpToImage
在下一个
read()

听起来更适合您的用例,前提是您可以使用它。下面给出了基本思路,并将与GIF一起使用,自动循环:

...

void MyWindow::init() {
  movie = new QMovie("mymovie.gif");
  if(!movie->isValid()) {
    qFatal("Movie not valid");
  }
  movie->stop(); // Ensure stopped.
}

void::MyWindow nextFrameSlot() {
  this->lbl->setPixmap(movie->currentPixmap());
  this->movie->jumpToNextFrame();
}

...

听起来GIF
QImageIOHandler
没有覆盖
jumpToImage
方法,这将导致使用该方法的默认实现(不做任何事情)。文档当然建议它应该支持
jumpToImage
。那么我应该如何从这里开始呢?如果没有办法解决这个问题,有没有其他方法可以手动加载gif帧?这当然是可能的,但并不像使用
QImageReader
那么简单。一个动画GIF被布置出来。因此,对于每一帧,您都有一个图形控件扩展结构,后面是一个图像描述符,可能是一个调色板,然后是LZW编码的像素数据。作为一个解决方案,这已经足够好了。我最初不这么做是因为我需要能够操纵每一帧,但是我不知道有一个jumpToNextFrame()方法,所以这个方法非常有效。谢谢
int imageCount () const
bool    jumpToImage ( int imageNumber )
...

void MyWindow::init() {
  movie = new QMovie("mymovie.gif");
  if(!movie->isValid()) {
    qFatal("Movie not valid");
  }
  movie->stop(); // Ensure stopped.
}

void::MyWindow nextFrameSlot() {
  this->lbl->setPixmap(movie->currentPixmap());
  this->movie->jumpToNextFrame();
}

...