我遇到了Qt GUI进度条的问题。问题是对于较大的文件,350MB及以上...进度条在开始时按预期工作,然后它似乎不会移动一段时间,然后突然它在作业完成时跳转到100%。我不确定为什么会发生这种情况,我想知道是否有一些Qt神秘导致这种情况或我是否做错了。
#include "aClass.h"
#include <QString>
#include <QTextStream>
#include <QByteArray>
#include <QFile>
const char aClass::BLOCK_MODE_CBC = 1;
aClass::aClass()
{
}
qint64 aClass::doWorkA (const QString fileNameSrc, const QString fileNameDst, byte * a, byte * b, aBitSizeInBytes sizeaBytes, RWBufferSizeInBytes rwBufferSize)
{
QFile infile(fileNameSrc);
QFile outfile(fileNameDst);
if(!infile.open(QIODevice::ReadOnly))
return -1;
if(!outfile.open(QIODevice::WriteOnly))
return -1;
qint64 sizeOfOriginalFileInBytes = infile.size();
//Set range for progress bar
int progressMax = sizeOfOriginalFileInBytes / rwBufferSize;
if(progressMax == 0)
progressMax = 1;
emit setRange(0, progressMax);
byte* readDataBuffer = new byte[rwBufferSize];
byte* writeDataBuffer = new byte[rwBufferSize];
qint64 readSize = 0;
qint64 writeSize = 0;
int progressCounter = 0;
while (!infile.atEnd()) {
readSize = infile.read((char*)readDataBuffer, rwBufferSize);
writeSize = readSize;
something.changeData(writeDataBuffer, readDataBuffer, writeSize);
outfile.write((char*)writeDataBuffer, writeSize);
//Update progress bar value
emit setValue(++progressCounter);
}
delete[] readDataBuffer;
delete[] writeDataBuffer;
infile.close();
outfile.close();
return 0;
}
答案 0 :(得分:2)
这是基于事件编程的经典问题。您需要确保永远不会阻止事件循环以保持GUI响应。如果不将主线程的控制权返回给Qt,则无法更新显示。
Qt的设计理念是主GUI线程永远不会长时间保持忙碌状态。您的工作是确保长时间运行的任务不会阻止事件队列。
这是上面user763305的processEvents建议。从技术上讲,这是一个临时解决方案,因为它只是解决问题。
这是一个更清洁的解决方案 - 通过将您的工作分成工作线程,您可以让GUI保持对传入事件的响应。 Qt提供了多种同时执行代码的方法。有关详细信息,请参阅以下链接。
来源: