Evgenii Legotckoi
18 листопада 2018 р. 20:52

Qt/C++ - Підручник 086. Використання QSequentialAnimationGroup і QPropertyAnimation для переміщення кнопки

Напишемо невеликий приклад програми, в якій пересуватиметься кнопка за допомогою анімацій властивостей. Для цього скористаємося класами QSequentialAnimationGroup та QPropertyAnimation .

QSequentialAnimationGroup є класом, що об'єднує кілька анімацій в одну групу, що дозволяє автоматично запускати одну анімацію, коли завершилася попередня QPropertyAnimation.

Анімація запускатиметься натисканням кнопки і ця сама кнопка пересуватиметься у вікні так, як показано на зображенні.


Проект створимо за замовчуванням у Qt Creator, а всі зміни стосуватимуться тільки класу Widget. Додасть кнопку QPushButton через графічний дизайнер.

Widget.h

А ось і сам приклад у коді

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QWidget>
  5.  
  6. #include <QSequentialAnimationGroup>
  7.  
  8. namespace Ui {
  9. class Widget;
  10. }
  11.  
  12. class Widget : public QWidget
  13. {
  14. Q_OBJECT
  15.  
  16. public:
  17. explicit Widget(QWidget *parent = nullptr);
  18. ~Widget();
  19.  
  20. private slots:
  21. void onClickButton();
  22.  
  23. private:
  24. Ui::Widget *ui;
  25.  
  26. // Группа анимации для кнопки
  27. QSequentialAnimationGroup* animationGroup;
  28. };
  29.  
  30. #endif // WIDGET_H

Widget.cpp

Важливим моментом є те, що ми створюємо QPropertyAnimation із зазначенням тієї властивості, яку потрібно анімувати. В даному випадку це "geometry" . Властивість можна анімувати, якщо вона оголошена у класі як Q_PROPERTY. Тоді виконується плавна зміна значень цієї властивості.

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3.  
  4. #include <QPropertyAnimation>
  5. #include <QDebug>
  6.  
  7. Widget::Widget(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12.  
  13. // Создадим группу анимации
  14. animationGroup = new QSequentialAnimationGroup(this);
  15.  
  16. // Создадим анимацию свойства передвижения слева-сверху направо-сверху
  17. QPropertyAnimation* leftTopToRightTop = new QPropertyAnimation(ui->pushButton, "geometry");
  18. leftTopToRightTop->setDuration(1000); // Длительность анимации
  19. leftTopToRightTop->setStartValue(ui->pushButton->geometry()); // Стартовая позиция и геометрия анимации
  20. leftTopToRightTop->setEndValue(ui->pushButton->geometry().translated(100, 0)); // Конечная позиция и геометрия анимации
  21. animationGroup->addAnimation(leftTopToRightTop); // Добавим анимацию в группу
  22.  
  23. // Справа-сверху вниз-справа
  24. QPropertyAnimation* rightTopToRightBottom = new QPropertyAnimation(ui->pushButton, "geometry");
  25. rightTopToRightBottom->setDuration(1000);
  26. rightTopToRightBottom->setStartValue(leftTopToRightTop->endValue());
  27. rightTopToRightBottom->setEndValue(leftTopToRightTop->endValue().toRect().translated(0, 100));
  28. animationGroup->addAnimation(rightTopToRightBottom);
  29.  
  30. // Снизу-справа налево-вниз
  31. QPropertyAnimation* rightBottomToLeftBottom = new QPropertyAnimation(ui->pushButton, "geometry");
  32. rightBottomToLeftBottom->setDuration(1000);
  33. rightBottomToLeftBottom->setStartValue(rightTopToRightBottom->endValue());
  34. rightBottomToLeftBottom->setEndValue(rightTopToRightBottom->endValue().toRect().translated(-100, 0));
  35. animationGroup->addAnimation(rightBottomToLeftBottom);
  36.  
  37. // Слева-снизу наверх-слева
  38. QPropertyAnimation* leftBottomToLeftTop = new QPropertyAnimation(ui->pushButton, "geometry");
  39. leftBottomToLeftTop->setDuration(1000);
  40. leftBottomToLeftTop->setStartValue(rightBottomToLeftBottom->endValue());
  41. leftBottomToLeftTop->setEndValue(rightBottomToLeftBottom->endValue().toRect().translated(0, -100));
  42. animationGroup->addAnimation(leftBottomToLeftTop);
  43.  
  44. // Подключаем нажатие кнопки к слоту обработчику кнопки
  45. connect(ui->pushButton, &QPushButton::clicked, this, &Widget::onClickButton);
  46. }
  47.  
  48. Widget::~Widget()
  49. {
  50. delete ui;
  51. }
  52.  
  53. void Widget::onClickButton()
  54. {
  55. // Запускаем анимацию
  56. animationGroup->start();
  57. }

Висновок

Таким чином можна налаштувати різну анімацію для властивостей об'єкта, які позначені макросом Q_PROPERTY і мають методи set і get.

Посилання на репозиторій Git

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    22 листопада 2024 р. 21:51
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…