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

     有时候需要处理一些跟界面无关的但非常耗时的事情,这些事情跟界面在同一个线程中,由于时间太长,导致界面无法响应,处于“假死”状态。例如:在应用程序中保存文件到硬盘上,从开始保存直到文件保存完毕,程序不响应用户的任何操作,窗口也不会重新绘制,从而处于“无法响应”状态,这是一个非常糟糕的体验 。

     在这种情况下,有一种方法是使用多线程,即在子线程中处理文件保存,主线程负责界面相关。

     而如果不想使用多线程,最简单的办法就是在文件保存过程中频繁调用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();
}

显示效果如下:

ScreenClip

转载于:https://www.cnblogs.com/xiongxuanwen/p/5431027.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指offer之数组中的逆序对

1 问题 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。 比如数列{6&#xff0c;202&#xff0c;100&#xf…

【EPS精品教程】基于DOM和DSM创建垂直模型、加载垂直模型

本教程讲解EPS三维测图模块,主要内容有新建工程、创建垂直模型,为后续工作做准备。 目录 一、创建工程 二、生成垂直摄影模型

从旧金山到上海, HTTP/3 非常快!

HTTP/3 是超文本传输协议 (HTTP) 的第三个版本&#xff0c;它对 Web 性能来说意义重大, 让我们看看HTTP/3 如何让网站的速度变得更快&#xff01;等等&#xff0c;HTTP/2 发生了什么? 不是几年前才开始推广 HTTP/2 吗? 确实是这样, 但是它出现了一些 问题[1]&#xff0c; 包括…

最大尺寸分辨率_未来就在眼前——视涯科技推出最高分辨率硅基OLED显示屏幕...

声明&#xff1a;新闻稿非映维官方稿件&#xff0c;任何法律问题均与映维无关视涯科技•未来就在眼前2019年7月9日&#xff0c;在位于合肥新站高新区的自建工厂内&#xff0c;视涯科技(以下简称&#xff1a;“视涯”)作为一家半导体显示技术公司&#xff0c;公布开发中的两款硅…

Qt 第二步 熟悉文件结构组成(二)

目录导航&#xff1a; 《Qt 第一步 HelloWorld 的第一个程序》 《Qt 第二步 槽与信号&#xff08;一&#xff09; 实现点击按钮并弹窗》 本文参考《Qt5.9 c开发》 上一篇文使用了槽与信号完成了点击按钮并弹窗的程序效果&#xff0c;这一篇文将会了解Qt的项目文件组成。本节将会…

ArrayList实现

ArrayList实现 数组实现父类:AbstractList接口:List&#xff0c;RandomAccess&#xff0c;Cloneable&#xff0c;Serializable字段://默认容量private static final int DEFAULT_CAPACITY 10;//空的数组,构造函数参数为0和trim中使用,构造参数给0的人绝对会被打死,每放一个元素…

oracle数据本机自动备份

1、创建三个文件 exp.list 内容&#xff1a;oracle数据库的用户名和密码 name pwd exp.log 主要用于存储在自动备份数据库时的日志信息 exp.sh #!/bin/sh#找到数据库的路径 export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/10.2.0/db_1 export …

Chrome浏览器切换到之前打开的标签页会重新加载

这是谷歌的一种策略。当系统内存不足时&#xff0c;系统会自动从内存中舍弃标签页 在地址栏输入chrome://flags/#automatic-tab-discarding&#xff0c;设置为停用即可。转载于:https://www.cnblogs.com/freefish12/p/5435585.html

数据结构之判断一棵树是不是满二叉树

1 满二叉树 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。 2 分析 我们知道满二叉树是三…

【Pix4d精品教程】Pix4DMapper 4.4.10/4.4.12/4.5.6经典手把手图文安装教程(附安装包下载)

Pix4Dmapper系列文章合集: 打开Pix4DMapper时提示Pix4DMapper.exe已停止工作的完全解决办法安装Pix4Dmapper时提示“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll”完全解决办法Pix4Dmapper完整航测内业操作流程手把手图文教程Pix4Dmapper是一款目前比…

php基础教程 第一步 环境配置及helloworld

PHP 是服务器端脚本语言。全称为 Hypertext Preprocessor 为超文本预处理器。 据说php8不久后也要发布了&#xff0c;趁着8还没有发布赶紧写一个php5到php7&#xff08;在基础教程写完后将写php7新特性&#xff09;的教程。PHP版本之间更新会增加新特性&#xff08;别的语言也…

Hadoop(五)C#操作Hive

HiveHive将HiveQL&#xff08;类sql语言&#xff09;转为MapReduce&#xff0c;完成数据的查询与分析&#xff0c;减少了编写MapReduce的复杂度。它有以下优点&#xff1a;学习成本低&#xff1a;熟悉sql就能使用良好的数据分析&#xff1a;底层基于MapReduce实现同样存在一些缺…

【Solidity】3.类型 - 深入理解Solidity

索引 【Solidity】1.一个Solidity源文件的布局【Solidity】2.合约的结构体 【Solidity】3.类型 【Solidity】4.单位和全局可变量 【Solidity】5.表达式和控制结构 【Solidity】6. 合约 【Solidity】7. 部件 【Solidity】8. 杂项 类型 Solidity是一种静态类型的语言&#xff0c;…

etree解析xml_在python中使用Etree解析XML配置文件

请帮助我使用lxml etree解析以下原型的配置文件。我尝试了for event&#xff0c;element和tostring。不幸的是&#xff0c;我不需要文本&#xff0c;而是需要对于给定的属性。在我从这段代码开始&#xff0c;但是在搜索属性时遇到一个键错误&#xff0c;因为它从一开始就扫描^{…

深度优先搜索——八皇后问题

代码&#xff1a;&#xff08;控制台打印不了92种情况&#xff0c;只打印前10种&#xff09; 1 #include<iostream>2 #include<string>3 #include<windows.h>4 #define ok 15 #define error 06 using namespace std;7 8 9 int a[9][9]{0}; 10 int num0; 1…

【CASS精品教程】CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总

目录 第一种方法:Win+R 第二种方法:选择打开方式 第三种方法:cmd 在用CASS7.1 软件进行断面法土方量计算,在生成断面图后,需要进行道路设计参数文件的设计,打开断面设计参数文件的时候,无响应,提示roadpara,如下所示:

数据结构之判断一棵树是不是完全二叉树

1 完全二叉树 完全二叉树是由 满二叉树 而引出来的。对于深度为K的&#xff0c;有n个结点的二叉树&#xff0c;当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 如下就是完全二叉树 12 3 4 5 …

ubuntu添加中文输入法

Ubuntu上的输入法主要有小小输入平台&#xff08;支持拼音/二笔/五笔等&#xff09;&#xff0c;Fcitx&#xff0c;Ibus&#xff0c;Scim等。其中Scim和Ibus是输入法框架。在Ubuntu的中文系统中自带了中文输入法&#xff0c;通过CtrlSpace可切换中英文输入法。这里我们主要说下…

打开vs2010,提示无效的许可证数据,需要重新安装

解决办法&#xff1a; 1. 找到安装路径下Microsoft Visual Studio 10.0\Common7\IDE\DDConfigCA.exe ,使用管理员权限运行该exe文件&#xff0c;等待自然退出&#xff1b; 2. 重启VS&#xff0c;重新输入产品密钥&#xff0c;VS2010专业版&#xff08;or旗舰版&#xff09;密…

python3 爬虫第三步 本文包你学会正则 不会就来锤我

简介 正则表达式是一种描述字符的一种方式&#xff0c;通过该方式&#xff0c;匹配字符串。 正则表达式是自由的&#xff0c;一个字符的含义往往代表着一类字符&#xff0c;通过多个正则正则符号的组合描述&#xff0c;可以使组成的正则表达式能够描述一类字符串。 在开发中&a…