Qt 如何处理密集型耗时的事情(频繁调用QApplication::processEvents)
来源:互联网 发布:北京交通大学知行论坛 编辑:程序博客网 时间:2024/05/29 18:13
有时候需要处理一些跟界面无关的但非常耗时的事情,这些事情跟界面在同一个线程中,由于时间太长,导致界面无法响应,处于“假死”状态。例如:在应用程序中保存文件到硬盘上,从开始保存直到文件保存完毕,程序不响应用户的任何操作,窗口也不会重新绘制,从而处于“无法响应”状态,这是一个非常糟糕的体验 。
在这种情况下,有一种方法是使用多线程,即在子线程中处理文件保存,主线程负责界面相关。
而如果不想使用多线程,最简单的办法就是在文件保存过程中频繁调用QApplication::processEvents()。该函数的作用是让程序处理那些还没有处理的事件,然后再把使用权返回给调用者。
代码如下:
bool MyApp::writeFile(const QString &filename){ QFile file(filename);... QApplication::setOverrideCursor(Qt::WaitCursor); for(int r = 0; r != rowCount; ++r) { for(int c = 0; c != colCount; ++c) { out << table(r,c); qApp.processEvents(); } } QApplication::restoreOverrideCursor();}
这样一来,程序就能响应了。
但是,该方法有一个问题:可能正在保存文件的过程中,用户不小心又单击了保存,或不小心关闭了程序主窗口,这样会产生意想不到的后果。
解决这个问题的最简单的办法是替换成:
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);//它可以忽略用户的输入(鼠标和键盘事件)。
进一步的,如果想显示一个带有进度条的对话框,随时显示当前的进度状态,可以使用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();}
显示效果如下:
http://www.cnblogs.com/xiongxuanwen/p/5431027.html
0 0
- Qt 如何处理密集型耗时的事情(频繁调用QApplication::processEvents)
- Qt 如何处理密集型耗时的事情(频繁调用QApplication::processEvents)
- Qt 如何处理密集型耗时的事情(频繁调用QApplication::processEvents)
- pyQt4实时显示--QApplication.processEvents
- 用户频繁操作耗时开关的处理办法
- Python的Threading多线程处理(IO密集型处理)
- Qt 主函数中qapplication的exec()过程
- Qt事件传递机制(QApplication::installEventFilter的作用)
- Qt QApplication
- QT之QApplication的exit,quit调用后仍然显示窗口
- 如何处理UI与耗时操作的通信
- Node.js中如何处理耗时长的任务
- QT QApplication初始化是怎样的呢?
- QT学习笔记(一):QApplication class
- Qt中针对比较耗时的工作防止界面假死的处理方式
- GLSurfaceView 的onDrawFrame()频繁调用
- QT Embedded-----QApplication
- Qt QApplication 类简介
- MFC中Tab控件的使用详解
- 1020. 月饼 (25)
- java内存管理深入浅出
- Nagios利用NRPE监控Linux主机
- mysql的锁
- Qt 如何处理密集型耗时的事情(频繁调用QApplication::processEvents)
- Spring Boot实战(三)
- 僵尸进程是如何产生的?怎样避免僵尸进程的产生
- salt实例---安装nginx
- JavaScript学习-组合使用构造函数和原型模式
- Centos X 下安装桌面环境,flash,mysql等
- docker 使用问题总结
- 软件测试原则,五大要素
- JAVA 读取Excel 2007 所需jar,jdk1.6