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);
}
}