Дмитрий
Шілде 6, 2017, 10:22 Т.Қ.

QMovie сыныбымен Qt-де gif анимациясын пайдалану

Все видели в интернете красивые анимированные изображения. Их можно скачать на свой компьютер качестве файла с расширением gif. Возникает вопрос — можно ли использовать разместить эти картинки в своих программах? Можно, отвечает библиотека Qt. Рассмотрим, как это сделать.

Создаём новый проект типа Qt widgets. Добавляем объект класса QMovie для воспроизведения анимации. На форме размещаем объект класса QLabel. В конструкторе приложения указываем имя файла для объекта, воспроизводящего анимацию:

  1. mo.setFileName(":/ico/loader.gif");

Передаём указатель на этот объект в label:

  1. ui->label->setMovie(&mo);

Запускаем воспроизведение анимации:

  1. mo.start();

Файл widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QMovie>
  5. namespace Ui {
  6. class Widget;
  7. }
  8. class Widget : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Widget(QWidget *parent = 0);
  13. ~Widget();
  14. private slots:
  15. void setSpeedMovie(int);
  16. void setSizeMovie(int);
  17. private:
  18. Ui::Widget *ui;
  19. QMovie mo;
  20. double m;
  21. };
  22. #endif // WIDGET_H

В классе QMovie предусмотрены функции для управления скоростью воспроизведения setSpeed() и масштабом setScaledSize(). Первой функции необходимо передать относительную скорость воспроизведения в процентах (100 — номинальная скорость, 200 — удвоенная), второй размеры прямоугольника, в который надо вписать ваш рисунок. В данной программе реализовано управление масштабом и скоростью с помощью двух объектов класса QSpinBox. Переменная m типа double нужна для того, чтобы сохранять пропорции gif-изображения при масштабировании.

Файл widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::Widget)
  6. {
  7. ui->setupUi(this);
  8.  
  9. QPixmap pix(":/ico/loader.gif");
  10. m = double(pix.width())/pix.height();
  11. mo.setFileName(":/ico/loader.gif");
  12. setSpeedMovie(ui->spinBox->value());
  13. setSizeMovie(ui->spinBox_2->value());
  14. ui->label->setMovie(&mo);
  15. mo.start();
  16. connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(setSpeedMovie(int)));
  17. connect(ui->spinBox_2, SIGNAL(valueChanged(int)), this, SLOT(setSizeMovie(int)));
  18. }
  19. Widget::~Widget()
  20. {
  21. delete ui;
  22. }
  23. void Widget::setSpeedMovie(int s)
  24. {
  25. mo.setSpeed(s);
  26. }
  27. void Widget::setSizeMovie(int size)
  28. {
  29. mo.setScaledSize(QSize(size*m, size));
  30. }

Использование gif-анимации может быть полезно либо для украшения приложения, либо для визуализации некоторых процессов, например загрузки или прогресса. Воспроизведение анимации можно остановить с помощью слота stop(). Рассмотренный проект можно скачать по ссылке .

Мақала бойынша сұралады0сұрақтар(лар)

1

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Evgenii Legotckoi
  • Шілде 6, 2017, 10:33 Т.Қ.

Добрый день, Dmitras.

Когда создаёте статью, используйте пожалуйста тег горизонтальной линии, чтобы отделить часть контента статьи, который находится в новостной ленте от той части, которая будет видна только на странице статьи.
В редакторе присутствует такая кнопочка на тулбаре. Это действует наподобие ката на Хабре.

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз