我有这个代码响应来自复选框的checked()信号。它应该将标签中的.gif文件更改为另一种颜色不同的.gif文件。我想使转换顺利,所以我尝试使用jumpToFrame()命令。代码如下:
void Scoreboard::poweractive1(bool checked)
{
if(checked==true) //checkbox is checked
{
int frame=logo1->currentFrameNumber(); //get current frame number
logo1->stop(); //stops previous gif
ui->label_96->clear(); //clear contents of label containing gif
ui->label_96->setMovie(logo1_or); // place second gif on the label
logo1_or->jumpToFrame(frame); // jumps frame number of second gif to the frame number
logo1_or->start(); //start gif animation
}else // same conditions as above, except it reverses the actions above
{
ui->label_95->clear();
ui->label_95->setPixmap(*bl_divider1);
int frame=logo1_or->currentFrameNumber();
logo1_or->stop();
ui->label_96->clear();
ui->label_96->setMovie(logo1);
logo1->jumpToFrame(frame);
logo1->start();
}
}
TL; DR版本:如何在特定帧上启动QMovie?
答案 0 :(得分:1)
我遇到了同样的问题,发现如果设置movie->jumpToFrame(int )
,movie->setCacheMode(QMovie::CacheAll);
可以正常工作
答案 1 :(得分:0)
我发现你必须按顺序跳到每一帧。
QMovie *m = new QMovie(path);
m->start();
m->setPaused(true);
// jumpToFrame only seems to work if you load the frames in order
int frame = 20;
bool ok = m->jumpToFrame(frame);
assert(ok); // fails
for(int i=0; i<=frame; i++)
{
bool ok = m->jumpToFrame(i);
assert(ok); //succeeds
}
意外发现了这一点,但这是有道理的。如果gif已经完成了整个循环,那么可能会有不同的工作方式。