• 9259阅读
  • 4回复

[提问]请教一个使用了QApplication::processEvents()之后的问题 [复制链接]

上一主题 下一主题
离线fariel
 

只看楼主 倒序阅读 楼主  发表于: 2011-07-21

  1. bool FileOperation::copyFile(const QString &source, const QString &destnation)
  2. {
  3.     QFile sourceFile(source);
  4.     if (!sourceFile.open(QIODevice::ReadOnly))
  5.     {
  6.         return false;
  7.     }
  8.     QFile destFile(destnation);
  9.     if(!destFile.open(QIODevice::WriteOnly))
  10.     {
  11.         return false;
  12.     }
  13.     while (true)
  14.     {
  15.         QByteArray tmpData = sourceFile.read(2048 * 1024);
  16.         if(tmpData.isEmpty())
  17.         {
  18.             break;
  19.         }
  20.         destFile.write(tmpData);
  21.         QApplication::processEvents();
  22.     }
  23.     if (!QFile::copy(source, destnation))
  24.     {
  25.         return false;
  26.     }
  27.     QApplication::processEvents();
  28.     return true;
  29. }
如上,这是一个复制的函数,我用QTreeView做的一个文件管理器,其中复制的时候,复制结束总是不能正确获得文件的真实大小,比如,拷贝一个5M的文件,但是拷贝到新目录结束之后显示4M,而且只要超过4M的文件复制过后都显示4M,需要重新进入一个文件夹或者返回以下这个新拷贝来的文件才显示大小正常,经测试,发现是用了QApplication::processEvents();的原因,注释掉这行之后,大小就显示正常了,但是没有QApplication::processEvents();也不行阿,滚动条会假死的,请高人帮我分析下究竟是怎么回事,怎么解决这个问题呢?怎么保证复制的时候界面不卡死,大小也显示正常呢
离线jdwx

只看该作者 1楼 发表于: 2011-07-21
多线程。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线fariel

只看该作者 2楼 发表于: 2011-07-22
除了多线程就没有别的办法了么

离线jdwx

只看该作者 3楼 发表于: 2011-07-22
回 2楼(fariel) 的帖子
多线程就是干这个用的,防界面假死 。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线lclflash

只看该作者 4楼 发表于: 2012-01-04
sendPostedEvents () 再把剩余事件处理一下。
快速回复
限100 字节
 
上一个 下一个