Дмитрий
6 июля 2017 г. 22:22

Использование gif-анимации в Qt с помощью класса QMovie

Содержание

Все видели в интернете красивые анимированные изображения. Их можно скачать на свой компьютер качестве файла с расширением 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 г. 22:33

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    22 ноября 2024 г. 21:51
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…