Qt 在状态栏中显示不断更新的百分比
Qt show constantly updating percentage in status bar
我有一个程序可以加载文件、对数据进行一些计算、将数据保存在内存中并打印到文本文件。
我想在状态栏中显示处理进度的百分比,我使用的代码如下:
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()
,我可以在 console/application 输出中看到百分比不断更新,但是状态栏仅在处理完成后更新并跳到 99%。
有什么办法让它实时更新吗?
干杯
您正在循环中更新进度状态,这会阻塞主 GUI 线程,因此您的标签文本不会得到更新。那是因为应该进行一些事件循环迭代来更新和处理与 GUI 相关的事件。一种可能的解决方案是在 while 循环中使用 QApplication::processEvents
:
...
progresslabel->setText(QString("Loading File: %1 \%").arg(progress));
qApp->processEvents(QEventLoop::AllEvents);
...
另一种解决方案是在新的线程中进行处理,并使用信号来报告进度状态。只需在工作线程中准备一个定期发出的信号,并将其连接到 GUI 线程中的插槽,并在进度百分比内更新标签。
我有一个程序可以加载文件、对数据进行一些计算、将数据保存在内存中并打印到文本文件。
我想在状态栏中显示处理进度的百分比,我使用的代码如下:
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()
,我可以在 console/application 输出中看到百分比不断更新,但是状态栏仅在处理完成后更新并跳到 99%。
有什么办法让它实时更新吗?
干杯
您正在循环中更新进度状态,这会阻塞主 GUI 线程,因此您的标签文本不会得到更新。那是因为应该进行一些事件循环迭代来更新和处理与 GUI 相关的事件。一种可能的解决方案是在 while 循环中使用 QApplication::processEvents
:
...
progresslabel->setText(QString("Loading File: %1 \%").arg(progress));
qApp->processEvents(QEventLoop::AllEvents);
...
另一种解决方案是在新的线程中进行处理,并使用信号来报告进度状态。只需在工作线程中准备一个定期发出的信号,并将其连接到 GUI 线程中的插槽,并在进度百分比内更新标签。