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 线程中的插槽,并在进度百分比内更新标签。