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);
这将首先处理与显示对话框相关的所有事件,然后才会开始繁重的工作(即解析文件)。
我需要加载一个大文件来使用 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);
这将首先处理与显示对话框相关的所有事件,然后才会开始繁重的工作(即解析文件)。