c++ - Qt:QGraphicsScene 没有在我期望的时候更新

标签 c++ qt qgraphicsscene

好的,我在名为 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() 只是在每次迭代时向场景添加新的场景对象,覆盖上次调用期间添加的对象。将场景想象成一扇冰箱门,当您调用 scene().addXXX 时,您正在向门上扔更多的冰箱磁铁:)

关于c++ - Qt:QGraphicsScene 没有在我期望的时候更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/715920/

相关文章:

c++ - 从守护进程中的 exec()'ed 进程读取 stdout/stderr

c++ - 在 3D 世界中使用 Alpha 混合的 Z 顺序

C++ 堆实现

qt - 拖放时将 QGraphics 项目与网格对齐

c++ - Qt 中的多色工具提示

c++ - 找到 QGraphicsScene 的中心位置?

c++ - 如果基类和派生类都有相同的成员变量,编译器如何决定调用哪个成员?

python - 如何使用 Python 3.3 和 Qt 5 构建 GUI 应用程序?

qt - 如何通过 Qt gui 应用程序显示视频的帧?

multithreading - PyQt:如何将停止信号发送到对象正在运行有条件的 while 循环的线程?