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