Qt jumpToFrame()不起作用

时间:2016-01-10 07:26:28

标签: qt animation gif

我有这个代码响应来自复选框的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?

2 个答案:

答案 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已经完成了整个循环,那么可能会有不同的工作方式。