在实际开发中,可能会遇到这样的场景:“一个操作非常耗时,但却无法获取其进度百分比”。造成这种情况的原因可能有: 
1)该操作属于第三方库(泛指我们使用但无法修改的第三方代码,因此质量有高有底),可能由于第三方库作者没有意识到这个操作在某些情况下会非常耗时,没有提供进度值。 
2)某些操作压根就无法计算进度或者计算进度要牺牲极大的效率。

这种场景,执行这样的耗时操作会导致程序UI假死。为了提高用户体验,我们可以为该操作提供一个假的进度条,即保证程序UI不假死。我们将耗时操作放到子线程中去执行,然后在GUI主线程中抛出一个进度对话框,用一个定时器每隔0.5秒(或者一个更合适的值)更新进度条的百分比。用一个循环待子线程执行完毕则GUI主线程继续往下执行。

void MainWindow::slotRun()
{
QProgressDialog progressDlg(tr("正在读取文件..."), tr("取消"),
, , this,
Qt::CustomizeWindowHint);
progressDlg.setWindowModality(Qt::WindowModal);
progressDlg.setMinimumSize(, );
progressDlg.show(); // 进度对话框在GUI主线程中执行 FileReader aFileReader("D:/BigFile.txt");
FunctionRunThread runThread(aFileReader); // 将耗时操作放到子线程中去执行
runThread.start();
int cnt = ; // 循环次数计数器,用于"计算"当前的进度值
while (!runThread.isFinished()) // 只要子线程还没有完成,就一直循环,并更新进度条
{
//QThread::currentThread()->wait(500);
//QApplication::instance()->thread()->wait(500); progressDlg.setValue((cnt++%)*); // 进度值每次递增5%,达到100后则再次从0开始 QEventLoop eventloop; // 使用事件循环阻塞主线程
QTimer::singleShot(, &eventloop, SLOT(quit())); // wait 0.5s
eventloop.exec(); // 每0.5秒执行一次事件循环,然后更新进度条
}
progressDlg.setValue();
qDebug() << "cnt=" << cnt;
}

偶然看到一个更高级的实现方式:

http://wiki.qt.io/Progress_Bar

http://blog.csdn.net/e5max/article/details/50441148

为进度条增加“伪进度条”?(使用QEventLoop和QTimer)的更多相关文章

  1. Axure教程:滑动进度条、圆形进度环的复杂交互效果实现方法

    滑动条.进度条.进度环,是产品原型中比较常见的进度展示功能.今天笔者分享的是使用Axure原型工具实现两种进度展示功能中相对复杂的交互效果. 效果一.可拖动.可显示进度值.可计算多个页面均值的滑动进度 ...

  2. 超赞的CSS3进度条 可以随进度显示不同颜色

    原文:超赞的CSS3进度条 可以随进度显示不同颜色 现在的WEB已经不是以前的WEB了,传输更大的数据量,有着更加复杂的计算,这就需要利用进度条来提高用户体验,必要时可以让用户耐心等待,不至于因操作卡 ...

  3. Xamarin XAML语言教程使用属性设置进度条的当前进度

    Xamarin XAML语言教程使用属性设置进度条的当前进度 在图12.19~12.21中我们看到的是没有实现加载的进度条,即进度条的当前进度为0,如果开发者想要修改当前进度,可以使用两种方式:一种是 ...

  4. Android BGradualProgress 多种渐变、直角or弧角、进度条、加载条

    可实现多种渐变.直角or弧角.进度条.加载条 (Various gradient, right or arc angle, progress bar and loading bar can be re ...

  5. MFC读写.txt文件时进度条显示实时进度

    整体实现方式:先获得文件长度,然后用每次读取的长度,计算出完成的百分比,用百分比的值设置进度条. 一.MFC进度条 Progress Control 相关函数 1. create() --创建Prog ...

  6. finger-guessing game:2增加游戏进度,界面title及游戏界面

    增加游戏进度,界面title及游戏界面 //初始化引擎组件 init(50, "div_caiquan", 800, 400, main); //定义游戏层,加载进度层.游戏背景层 ...

  7. progressbar使用方法:进度画面大小,进度画面背景,进度百分比

    前一段时间,因为项目须要研究了下progressbar,发现这个小东西还真是不简单.在这个小控件的显示效果上,花费的时间远大于预估的工作量.话说程序猿一直是这样,预估的工作量远少于实际...      ...

  8. Entity framewok 如何实现多条记录作为一条取出, for xml path如何实现

    http://www.myexception.cn/linq/1288046.html Entity framewok 怎么实现多条记录作为一条取出, for xml path怎么实现News表:ID ...

  9. oracle中根据当前记录查询前一条和后一条记录

    select * from aa01_2014 where aaa001=(select c.p from (select aaa001,lag(aaa001,1,0)  over (order by ...

随机推荐

  1. [Python]小笔记-queue

    queue的作用: 队列最大的作用就是先进先出(First in First Out).队列对于解决最短路的时候特别好用. python 2.7: 要使用队列,那么要加载头文件Queue,也就是imp ...

  2. IM-即时通讯技术概述

    IM-即时通讯技术概述 简述 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容.大多数常用的即时通讯发 ...

  3. 如何使用W5300实现ADSL连接(一)

    在介绍W5300连接ADSL之前,先给大家简单介绍一下WIZnet W5300这款芯片. W5300是WIZnet公司的一款单芯片器件,采用0.18μmCMOS工艺,内部集成10/100M以太网控制器 ...

  4. Android学习——百度地图开发定位与显示Demo

    百度地图给我们提供了很丰富的API供我们进行二次开发.百度地图的SDK与定位SDK在今年6月份进行了更新. 地图更新为3.0,定位更新为4.2.百度说:这次更新对接口有了较大部分的调整,与之前版本号不 ...

  5. LeetCode——Path Sum II

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  6. POJ 2104(K-th Number-区间第k大-主席树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 31790   Accepted: 9838 Cas ...

  7. TCP/IP之TCP连接的建立与中止状态分析

    TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手. 1.连接的建立: c端发起请求同步(用SYN段等于1的TCP报文),确认某个端口是否监听: s端应答(用ACK段等于1的TCP ...

  8. [置顶] PHP调用move_uploaded_file()提示 failed to open stream: Permission denied(Linxux环境,以Ubuntu12.04为例)

    在使用PHP上传文件之后,我们有时候还需要移动到特定的文件夹,这时候就要调用move_uploaded_file()函数,可是会出现如下错误: Warning: move_uploaded_file( ...

  9. main函数的参数问题 (转载)

    void main(int arg ,char *arv[]){} arg -- 命令行参数总个数arv[0] -- 参数1,程序名 arv[1] -- 参数2,字符串 arv[2] -- 参数3,字 ...

  10. activebar的用法

    效果图: 网站页面上弹出消息提示狂,用来提示重大事件. <script src="http://www.ijquery.cn/js/jquery-1.7.2.min.js"& ...