1

我正在使用 Qt 4.8。

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

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

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

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

这导致轮子根本不显示,因为当视图更新时,轮子已经设置为可见,然后再次不可见:

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

有什么我可以做的吗?

谢谢

4

2 回答 2

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 线程也是一个好主意。这可以通过将长时间运行的代码拆分为可由计时器触发的较小部分来完成。

于 2013-01-17T17:04:45.597 回答
0

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

于 2013-01-17T17:07:22.657 回答