Шаг 36.
Библиотека Qt.
Индикатор прогресса

    На этом шаге рассмотрим класс виджета индикатора прогресса QProgessBar.

    Индикатор прогресса (progress bar) — это виджет, показывающий процесс выполнения операции и заполняющийся слева направо. Полное заполнение индикатора информирует о завершении операции. Этот виджет необходим в том случае, когда программа выполняет продолжительные действия. Он дает пользователю понять, что программа не зависла, а находится в работе. Также он показывает, сколько уже проделано и сколько еще предстоит сделать.

    Класс QProgessBar виджета индикатора прогресса определен в заголовочном файле QProgressBar. Обычно индикаторы прогресса располагаются в горизонтальном положении, но это можно изменить, передав в слот setOrientation() значение Qt::Vertical — после этого он будет расположен вертикально.

    Следующий пример, приведенный на рис. 1, демонстрирует использование индикатора прогресса. При нажатии кнопки Шаг выполняется увеличение значения индикатора на один шаг. Нажатие кнопки Сброс сбрасывает значение индикатора.


Рис.1. Пример индикатора прогресса

    Для реализации работы данного приложения создадим три файла:

  1. progress.h - заголовочный файл с описанием класса Progress, производного от класса QWidget;
  2. progress.cpp - файл исходных текстов, который содержит описание конструктора класса Progress и функций-членов класса Progress (слотов slotStep() и slotReset());
  3. main.cpp - основная программа, в которой создается приложение и виджет индикатора прогресса.

    Листинг файла main.cpp:

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

int main (int argc, char** argv)
{
    QApplication app(argc, argv);
    app.setApplicationDisplayName("Индикатор процесса");
    //конструктор виджета индикатора прогресса
    Progress     progress;
    //отображение на экране виджета индикатора прогресса
    progress.show();

    return app.exec();
}

    Листинг файла progress.h:

#ifndef PROGRESS_H
#define PROGRESS_H
#include <QWidget>

class QProgressBar;
//класс Progress производный от класса QWidget
class Progress : public QWidget {
    Q_OBJECT
//объявляем переменные класса:
//указатель на объект класса QProgressBar
//целочисленную переменную step (шаг)
private:
    QProgressBar* pb;
    int           step;

public:
//конструктор класса Progress
    Progress(QWidget* pobj = 0);

public slots:
//функции-члены клласса Progress
    void slotStep ();//наращивание шага на 1
    void slotReset();//установка индикатора в нулевое положение
};

#endif // PROGRESS_H

    Листинг файла progress.cpp:

#include <QWidget>
#include <QPushButton>
#include "progress.h"
#include <QHBoxLayout>
#include <QProgressBar>
//описание конструктора класса
//в конструкторе класса переменной step присваивается значение 0
Progress::Progress(QWidget* pwgt/*= 0*/)
    : QWidget(pwgt)
    , step(0)
{
    //создаем объект индикатора прогресса
    pb = new QProgressBar;
    //вызов метода setRange устанавливает минимальное значение,
    //которое может принимать индикатор (0) и
    //количество шагов (10), т.е. увеличение будет на 10%
    pb->setRange(0, 10);
    //метод setMinimumWidth устанавливает минимальную 
    //длину виджета индикатора прогресса
    pb->setMinimumWidth(200);
    //вызов метода setAlignment() с параметром Qt::AlignCenter
    //переводит индикатор в режим отображения процентов в центре
    pb->setAlignment(Qt::AlignCenter);
    //создаем две кнопки, которые соединяются
    //со слотами slotStep() и slotReset()
    QPushButton* pdStep  = new QPushButton("&Шаг");
    QPushButton* pdReset = new QPushButton("&Сброс");

    QObject::connect(pdStep, SIGNAL(clicked()), SLOT(slotStep()));
    QObject::connect(pdReset, SIGNAL(clicked()), SLOT(slotReset()));

    //для размещения виджетов-потомков горизонтально, слева направо,
    //необходимо установить в виджете Progress объект класса компоновки QHBoxLayout,
    //предварительно добавив в него, в нужной очередности, виджеты-потомки
    QHBoxLayout* phbL = new QHBoxLayout;
    phbL->addWidget(pb);
    phbL->addWidget(pdStep);
    phbL->addWidget(pdReset);
    setLayout(phbL);
}
//в слоте slotStep() значение атрибута step увеличивается
//на 1 и передается в слот QProgressBat::setValue()
//объекта индикатора прогресса
void Progress::slotStep()
{
    pb->setValue(++step);
}
//слот slotReset() устанавливает значение атрибута step
//равным 0 и, вызвав слот QProgressBat::reset(),
//возвращает индикатор в исходное состояние
void Progress::slotReset()
{
    step = 0;
    pb->reset();
}

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим электронный индикатор.




Предыдущий шаг Содержание Следующий шаг