需求

在 qt 中既需要处理耗时任务,又不想使用多线程。

解决

可以在处理长时间耗时任务时,在耗时任务中周期性的调用 qApp.processEvents();, 这样可以让 qt 间断性的处理界面事务。比较推荐的是配合使用 QProgressDialog, 这样可以有进度条提示用户。代码如下:


bool MyApp::writeFile(const QString &filename)
{
     QFile file(filename);
...
    QApplication::setOverrideCursor(Qt::WaitCursor);
     QProgressDialog progress;
     progress.setWindowTitle(tableData->sNameCH);
     progress.setLabelText(QStringLiteral("数据保存中,请稍候..."));
     //progress.setCancelButton(0);//不显示“取消”按钮
     progress.setCancelButtonText("取消");
     progress.setRange(0,rowCount );
     progress.setModal(true);
     //此处没有调用show()来显示,是因为QProgressDialog会自动决定是否显示
     //如果时间过短,就不会显示。
     for(int r = 0; r != rowCount; ++r)
     {
	progress.setValue(row);
	//如果用户单击了“取消”,就取消保存文件,并删除该文件。
	if(progress.wasCanceled)
	{
	     file.remov();
	     return false;
	}
	for(int c = 0; c != colCount; ++c)
	{
	     out << table(r,c);
	     qApp.processEvents();
	}
     }
    QApplication::restoreOverrideCursor();
}

参考

Qt 如何处理密集型耗时的事情

QApplication::processEvents的作用