Barra de Progresso

Nesse tutorial veremos como fazer uma barra de progresso (em inglês *progress bar),* ela é utilizada para indicar o progresso de uma operação.

Para começarmos o tutorial, temos o aquivo header, cpp e o main:

progressbar.h

#pragma once

#include <QWidget>
#include <QProgressBar>
#include <QPushButton>

class ProgressBarEx : public QWidget {

  Q_OBJECT

  public:
    ProgressBarEx(QWidget *parent = 0);

  private:
    int progress;
    QTimer *timer;
    QProgressBar *pbar;
    QPushButton *startBtn;
    QPushButton *stopBtn;
    static const int DELAY = 200;
    static const int MAX_VALUE = 100;

    void updateBar();
    void startMyTimer();
    void stopMyTimer();
};

progressbar.cpp

#include <QProgressBar>
#include <QTimer>
#include <QGridLayout>
#include "progressbar.h"

ProgressBarEx::ProgressBarEx(QWidget *parent)
    : QWidget(parent) {

  progress = 0;
  timer = new QTimer(this);
  connect(timer, &QTimer::timeout, this, &ProgressBarEx::updateBar);

  QGridLayout *grid = new QGridLayout(this);
  grid->setColumnStretch(2, 1);

  pbar = new QProgressBar();
  grid->addWidget(pbar, 0, 0, 1, 3);

  startBtn = new QPushButton("Start", this);
  connect(startBtn, &QPushButton::clicked, this, &ProgressBarEx::startMyTimer);
  grid->addWidget(startBtn, 1, 0, 1, 1);

  stopBtn = new QPushButton("Stop", this);
  connect(stopBtn, &QPushButton::clicked, this, &ProgressBarEx::stopMyTimer);
  grid->addWidget(stopBtn, 1, 1);
}

void ProgressBarEx::startMyTimer() {

  if (progress >= MAX_VALUE) {

      progress = 0;
      pbar->setValue(0);
  }

  if (!timer->isActive()) {

    startBtn->setEnabled(false);
    stopBtn->setEnabled(true);
    timer->start(DELAY);
  }
}

void ProgressBarEx::stopMyTimer() {

  if (timer->isActive()) {

    startBtn->setEnabled(true);
    stopBtn->setEnabled(false);
    timer->stop();
  }
}

void ProgressBarEx::updateBar() {

  progress++;

  if (progress <= MAX_VALUE) {

    pbar->setValue(progress);
  } else {

    timer->stop();
    startBtn->setEnabled(true);
    stopBtn->setEnabled(false);
  }
}

main.cpp

#include <QApplication>
#include "progressbar.h"

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);
  janela ProgressBarEx;
  window.resize(250, 150);
  window.setWindowTitle("QProgressBar");
  janela.show();
  return app.exec();
}

Nesse exemplo, temos uma QProgressBar e dois botões de pressionar (push button). Um deles inicia o cronômetro, que consequentemente atualiza a barra de progresso, enquanto o outro interrompe o cronômetro. Como pode ser visto nesse trecho do código, onde o Qtimer é utilizado para controlar a janela da QProgressBar:

timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &ProgressBarEx::updateBar);

Criamos uma instância de QProgressBar, onde os valores padrões minimos e máximos são definidos como 0 e 100:

pbar = new QProgressBar();

Dependendo do estado da barra de progresso, os botões são ativados ou desativados. Isso é feito utilizando o método setEnable, dessa forma:

if (!timer->isActive()) {
  startBtn->setEnabled(false);
  stopBtn->setEnabled(true);
  temporizador->início(ATRASO);
}

O progresso é guardado na variavel “int progress”. O setValue atualiza o valor atual da barra de progresso:

void ProgressBarEx::updateBar() {

  progress++;

  if (progress <= MAX_VALUE) {

    pbar->setValue(progress);
  } else {

    timer->stop();
    startBtn->setEnabled(true);
    stopBtn->setEnabled(false);
  }
}