加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Qt:QGraphicsScene在我预期的时候没有更新

发布时间:2020-12-16 10:38:22 所属栏目:百科 来源:网络整理
导读:好的,我在一个名为eye的类中有一个QGraphicsScene.我叫一个函数: void eye::playSequence(int sequenceNum) { for (int i=0; isequences[sequenceNum].numberOfSlides(); i++) { presentSlide(sequenceNum,i); time_t start; time(start); bool cont=false;
好的,我在一个名为eye的类中有一个QGraphicsScene.我叫一个函数:

void eye::playSequence(int sequenceNum) {

    for (int i=0; i<sequences[sequenceNum].numberOfSlides(); i++) {
        presentSlide(sequenceNum,i);
        time_t start;
            time(&start);
            bool cont=false;
            while (!cont) {
                time_t now;
                time(&now);
                double dif;
                dif=difftime(now,start);
                if (dif>5.0)
                    cont=true;
            }
    }
}

每个幻灯片调用:

void eye::presentSlide(int sequenceNum,int slideNum) {

    Slide * slide=sequences[sequenceNum].getSlide(slideNum);

    QGraphicsPixmapItem * pic0=scene.addPixmap(slide->getStimulus(0)->getImage());
    pic0->setPos(0,0);

    QGraphicsPixmapItem * pic1=scene.addPixmap(slide->getStimulus(1)->getImage());
    pic1->setPos(horizontalResolution-350,0);

    QGraphicsPixmapItem * pic2=scene.addPixmap(slide->getStimulus(2)->getImage());
    pic2->setPos(horizontalResolution-350,verticalResolution-450);

    QGraphicsPixmapItem * pic3=scene.addPixmap(slide->getStimulus(3)->getImage());
    pic3->setPos(0,verticalResolution-450);
}

现在,我希望这会显示一组图像,等待5秒,然后显示下一个,依此类推.相反,它只显示所有幻灯片,然后显示最后四个图像.我试过在我可以成像的每个地方调用scene.update(),它没有做任何事情.看起来场景只在playSequence函数返回时才更新.任何想法可能会发生在这里?

解决方法

当人们想要进行连续动画时,这种情况经常出现在事件驱动的GUI框架中.我想猜测eye :: playSequence是从点击按钮调用还是从应用程序启动代码中的某个点调用的?无论如何,这是正在发生的事情.

Qt使用主应用程序线程来驱动事件循环.事件循环是这样的:

while(app_running)
{
  if(EventPending)
    ProcessNextEvent();
}

您看到的问题是屏幕更新是在绘制事件期间完成的.如果您在鼠标单击事件或任何其他事件期间运行某些代码,则您正在执行的所有绘图都将排队,并将在下一个绘制事件中绘制到屏幕上.有时需要一段时间才能沉入其中.

解决这个问题的最佳方法是稍微改变一下你的方法.一种方法是扔掉你的while循环并设置QTimer设置每5秒触发一次.在计时器插槽中,您可以绘制一张幻灯片.当计时器再次触发时,绘制下一张幻灯片等.

如果您想要更直接,更不优雅的快速修复,请在调用presentSlide(sequenceNum,i)后立即尝试调用qapp-> processEvents().这(大部分时间)将强制应用程序清除任何应包括绘制事件的排队事件.

我还要提一下,eye :: presentSlide()只是在每次迭代时向场景添加新的场景对象,覆盖在上次调用期间添加的场景对象.把这个场景想象成一个冰箱门,当你打电话给场景时().addXXX你在门上扔了更多的冰箱磁铁:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读