Qt显示状态栏中不断更新的百分比

时间:2015-03-09 08:07:52

标签: c++ qt statusbar progress

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

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

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

如何让它实时更新?

干杯

1 个答案:

答案 0 :(得分:2)

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

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

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