Все видели в интернете красивые анимированные изображения. Их можно скачать на свой компьютер качестве файла с расширением gif. Возникает вопрос — можно ли использовать разместить эти картинки в своих программах? Можно, отвечает библиотека Qt. Рассмотрим, как это сделать.
Создаём новый проект типа Qt widgets. Добавляем объект класса QMovie для воспроизведения анимации. На форме размещаем объект класса QLabel. В конструкторе приложения указываем имя файла для объекта, воспроизводящего анимацию:
- mo.setFileName(":/ico/loader.gif");
Передаём указатель на этот объект в label:
- ui->label->setMovie(&mo);
Запускаем воспроизведение анимации:
- mo.start();
Файл widget.h
- #ifndef WIDGET_H
- #define WIDGET_H
- #include <QWidget>
- #include <QMovie>
- namespace Ui {
- class Widget;
- }
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
- private slots:
- void setSpeedMovie(int);
- void setSizeMovie(int);
- private:
- Ui::Widget *ui;
- QMovie mo;
- double m;
- };
- #endif // WIDGET_H
В классе QMovie предусмотрены функции для управления скоростью воспроизведения setSpeed() и масштабом setScaledSize(). Первой функции необходимо передать относительную скорость воспроизведения в процентах (100 — номинальная скорость, 200 — удвоенная), второй размеры прямоугольника, в который надо вписать ваш рисунок. В данной программе реализовано управление масштабом и скоростью с помощью двух объектов класса QSpinBox. Переменная m типа double нужна для того, чтобы сохранять пропорции gif-изображения при масштабировании.
Файл widget.cpp
- #include "widget.h"
- #include "ui_widget.h"
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- QPixmap pix(":/ico/loader.gif");
- m = double(pix.width())/pix.height();
- mo.setFileName(":/ico/loader.gif");
- setSpeedMovie(ui->spinBox->value());
- setSizeMovie(ui->spinBox_2->value());
- ui->label->setMovie(&mo);
- mo.start();
- connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(setSpeedMovie(int)));
- connect(ui->spinBox_2, SIGNAL(valueChanged(int)), this, SLOT(setSizeMovie(int)));
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::setSpeedMovie(int s)
- {
- mo.setSpeed(s);
- }
- void Widget::setSizeMovie(int size)
- {
- mo.setScaledSize(QSize(size*m, size));
- }
Использование gif-анимации может быть полезно либо для украшения приложения, либо для визуализации некоторых процессов, например загрузки или прогресса. Воспроизведение анимации можно остановить с помощью слота stop(). Рассмотренный проект можно скачать по ссылке .
Добрый день, Dmitras.