好了,所以我得在一个类中调用眼睛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框架当想要做连续的动画行为的种类。我要去猜测,眼:: playSequence从一个按钮点击或可能从应用程序启动代码中的某些点叫什么名字?在任何情况下,这里是发生了什么事情。

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

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

您所看到的问题是,对屏幕的更新Paint事件过程中完成的。如果你是一个鼠标点击事件或任何其他事件中运行一些代码,那么你正在做的图纸排队,并会被绘制到屏幕上的下一个绘画事件。有时需要一段时间这在下沉。

要解决这一问题的最好办法是改变你的方法一点。一个办法是扔掉你的while循环,并设置一个QTimer设定为每5秒触发。在计时器插槽可以绘制一张幻灯片。当定时器再次开火,绘制下一幻灯片等

如果你想有一个更直接,那么优雅速战速决,尝试调用qapp-> processEvents()您的来电presentSlide之后(sequenceNum,I)。这个(大部分时间)将迫使应用程序,以清除任何排队的事件,其中应包括油漆事件。

我还要提到的是眼:: presentSlide()仅添加新场景对象的场景在每次迭代覆盖最后一次通话期间添加的的那些。想到现场为冰箱门的,当你调用场景()addXXX你在门上扔更多的冰箱贴。)

其他提示

您需要让应用程序的事件循环,以保持更新了用户界面运行。从你的代码最简单的方法是调用的QApplication :: processEvents()在你的内心,而循环。

很多人会认为你的while循环是低效率的 - 毕竟,你只是等待的时间过去给定时间。你可能要考虑重组你的代码使用定时器来代替。

您可以在你的眼睛类的构造函数创建一个QTimer对象,设置5秒的超时,其超时()信号连接到你的眼睛一流的插槽,更新索引到组幻灯片,并呼吁presentSlide ()。你会启动定时器在playSequence()函数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top