Qt 4.8 - 在更新QGraphicsScene时显示“加载”动画

时间:2013-01-17 16:55:16

标签: c++ multithreading qt qt4 qgraphicsscene

我正在使用Qt 4.8。

我有一个很大的QGraphicsScene要更新(附加新的QGraphicsObjects需要3秒)。 我想向用户显示更新正在进行中。 特别是我想在屏幕上显示加载轮,而不是在更新结束时将其移除。

这里的问题是我应该让车轮可见,然后在车轮上看不到 场景更新的同一线程。这是因为:

  • 不允许在gui线程之外编辑图形属性。

  • 我无法在“工作线程”中移动计算,因为它涉及图形。

这导致车轮完全没有显示,因为当车轮更新视图时 已经设置可见,然后再次不可见:

showWheel();
/*... big computation involving graphics ...*/
hideWheel();
/*... here GUI is updated, thus the wheel doesn't show up...*/

我能做些什么吗?

由于

2 个答案:

答案 0 :(得分:1)

据推测,你有一些事件会触发计算。不使用它来触发计算,而是使用它来触发scheduleComputation()槽。 scheduleComputation插槽可以调用showWheel(),然后为下一个事件队列的末尾安排doComputation()插槽,之后它将返回。这将允许事件循环运行并显示您的车轮,然后执行计算。计算结束后,您可以调用hideWheel()并返回事件循环。

这样的事情:

void scheduleComputation()
{
    computeScheduler = new QTimer(this);
    computeScheduler->setInterval(0);
    connect(computeScheduler,SIGNAL(timeout()),this,SLOT(doComputation()));
    showWheel();
}

void doComputation()
{
    //...Computation Here...
    hideWheel();
}

禁止长时间阻止UI线程也是一个好主意。这可以通过将长时间运行的代码分成可以由计时器触发的较小部分来完成。

答案 1 :(得分:0)

在“大计算”中,您可以让事件处理程序运行一段时间。