Qt加载大文件或其他东西时如何实现提示对话框?

How to realize a prompt dialog box when load a large file or other things using Qt?

我需要加载一个大文件来使用 OpenGL 进行解析和绘制。整个过程非常耗时。所以想实现parse前的提示对话框。但是下面的代码是行不通的。

void parseFile()
{
    QMessageBox* msgbox = new QMessageBox();
    msgbox->setModal(false);
    msgbox->setWindowTitle(tr("message box"));
    msgbox->setText("Please wait patiently......")
    msgbox->show();

    /* parse file and draw */
    ......
}

但它显示像也被冻结了:

如何实现?

show()实际上并没有显示对话框的内容。它只告诉事件循环尽快显示对话框。但是由于您在 show() 之后立即调用了更多代码,因此 evnt 循环没有机会完成它的工作。

解决此问题的最简单方法是在 msgbox->show() 之后调用 QCoreApplication::processEvents()。这将强制事件循环立即完成工作。

如果这不起作用,请尝试此参数 QCoreApplication::processEvents(QEventLoop::WaitForMoreEvents)

另一种选择是将繁重的计算转移到函数中,而不是显示对话框,然后使用计时器安排计算。

...
msgbox->show();
QTimer::singleShot(0, &doHeavyWork);

这将首先处理与显示对话框相关的所有事件,然后才会开始繁重的工作(即解析文件)。