gpt4 book ai didi

c++ - Qt 在状态栏中显示不断更新的百分比

转载 作者:行者123 更新时间:2023-11-30 03:55:40 24 4
gpt4 key购买 nike

我有一个程序可以加载一个文件,对数据进行一些计算,将数据保存在内存中并打印到一个文本文件中。

我想在状态栏中显示处理进度的百分比,我使用的代码如下:

    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%。

有什么办法让它实时更新吗?

干杯

最佳答案

您正在循环中更新进度状态,这会阻塞主 GUI 线程,因此您的标签文本不会得到更新。那是因为应该进行一些事件循环迭代来更新和处理与 GUI 相关的事件。一种可能的解决方案是在 while 循环中使用 QApplication::processEvents:

...
progresslabel->setText(QString("Loading File: %1 \%").arg(progress));
qApp->processEvents(QEventLoop::AllEvents);
...

另一种解决方案是在新的线程中进行处理,并使用信号来报告进度状态。只需在工作线程中准备一个定期发出的信号,并将其连接到 GUI 线程中的插槽,并在进度百分比内更新标签。

关于c++ - Qt 在状态栏中显示不断更新的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28937488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com