这有三种主要方法,每种方法都有其优点和缺点。
的
简单,不可扩展的解决方案
</强>
最简单的方法是打电话
QApplication::processEvents()
手动在“繁忙”代码中。例如,要手动更新每个循环的GUI,您可以这样做:
for (int i = 0; i < 5000; ++i) {
label->setText(tr(“At Index %1…”).arg(i));
QApplication::processEvents();
}
</code>
的
优点
</强>
很容易
没有并发问题
</醇>
的
缺点
</强>
功能非常有限
污染代码
</醇>
的
主题
</强>
如果你想要一个简单的解决方案,但是可扩展的解决方案,继承QThread,然后在一个单独的线程中运行非GUI任务是一个很好的方法:
class MyThread: QThread
{
Q_OBJECT
void run()
{
for (size_t i = 0; i < 50000; ++i) {
std::cout << i << std::endl;
}
}
};
auto *thread = new MyThread;
thread->start();
</code>
当这个长任务发生时,GUI将更新,Qt将负责垃圾收集。
的
优点
</强>
相当简单
强大,可扩展,信号/插槽允许数据交换
</醇>
的
缺点
</强>
您
的
不能
</强>
从主线程以外的任何线程更新GUI。
信号/插槽必须使用QueuedConnection。
</醇>
的
事件循环
</强>
最后一种方法是Qt的原生解决方案:QEventLoop。
QTimer timer;
QEventLoop loop;
timer.setSingleShot(true);
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
timer.start(5000);
loop.exec();
</code>
这实际上不太直观,但在大多数情况下通过避免忙碌等待恰好好得多。
的
优点
</强>
最小的CPU使用率
</醇>
的
缺点
</强>
不太直观。
</醇>
你可以阅读更多
这里
。我最初拥有一个具有相同信息的现代资源,因此如果您在Qt5文档中找到类似的链接,请编辑此帖子。