我有一个加载文件的程序,对数据进行一些计算,将数据保存在内存中并打印到文本文件。
我想在状态栏中显示处理进度的百分比,我使用以下代码:
percent=file.pos()*10000/file.size();
if((percent!=progress)&&(percent%5==1)){
progress=percent/100;
qDebug() << progress;
progresslabel->setText(QString("Loading File: %1 \%").arg(progress));
以下是以下功能的一部分:
void MainWindow::CalcIntegral(){
int percent,progress;
progress=1;
SingleLineData.resize(GRIDDIM*GRIDDIM);
SingleLineData.fill(0);
QString test;
QString inputfile = QFileDialog::getOpenFileName(
this,
tr("Open Data File"),
"/Users",
"Data files (*.txt)"
);
if(inputfile == NULL)
return;
QFile file(inputfile);
qDebug()<<"TEST";
if(!file.open(QIODevice::ReadOnly)){
}
// QTextStream in(&file);
OpenFileData = new QTextStream(&file);
double buffer;
OpenFilePositions.resize(0);
OpenFilePositions.push_back(-2);
OpenFileData->readLine();
progresslabel = new QLabel;
ui->statusBar->addWidget(progresslabel);
while(!OpenFileData->atEnd()){
for(int i=0; i<512; i++){
*OpenFileData >> buffer;
SingleLineData[i]+=buffer;
}
percent=file.pos()*10000/file.size();
if((percent!=progress)&&(percent%5==1)){
progress=percent/100;
qDebug() << progress;
progresslabel->setText(QString("Loading File: %1 \%").arg(progress));
}
OpenFilePositions.push_back(OpenFilePositions.last()+6*(NUMBER_OF_AFE_CHIPS*AFECHANNELS)+1);
}
OpenFilePositions.removeFirst();
OpenFilePositions.push_front(0);
qDebug() << SingleLineData;
qDebug() << OpenFilePositions.size();
// ************* file output **************************************************
// QString filename = QFileDialog::getSaveFileName(
// this,
// tr("Save File"),
// "/Users",
// "Text files (*.txt)"
// );
QString OutputFile = inputfile;
OutputFile.replace(".txt","_integral.int");
QFile fileout(OutputFile);
fileout.open(QFile::WriteOnly);
QTextStream out(&fileout);
for(int i=0;i<512;i++){
out<<SingleLineData[i]<<"\t";
}
fileout.close();
}
由于qDebug()
,我可以看到控制台/应用程序输出中的百分比不断更新,但状态栏仅在处理完成后更新并向右跳转到99%。
如何让它实时更新?
干杯
答案 0 :(得分:2)
您正在循环中更新进度状态,阻止主GUI线程,因此您的标签文本不会更新。那是因为应该进行一些事件循环迭代来更新和处理GUI相关事件。一种可能的解决方案是在while循环中使用QApplication::processEvents
:
...
progresslabel->setText(QString("Loading File: %1 \%").arg(progress));
qApp->processEvents(QEventLoop::AllEvents);
...
另一种解决方案是在新线程中执行处理并使用信号来报告进度状态。只需在工作线程中准备一个周期性发出的信号,并将其连接到GUI线程中的插槽,并在进度百分比内更新标签。