- 1. Widget.h
- 2. Widget.cpp
- 3. Висновок
Напишемо невеликий приклад програми, в якій пересуватиметься кнопка за допомогою анімацій властивостей. Для цього скористаємося класами QSequentialAnimationGroup та QPropertyAnimation .
QSequentialAnimationGroup є класом, що об'єднує кілька анімацій в одну групу, що дозволяє автоматично запускати одну анімацію, коли завершилася попередня QPropertyAnimation.
Анімація запускатиметься натисканням кнопки і ця сама кнопка пересуватиметься у вікні так, як показано на зображенні.
Проект створимо за замовчуванням у Qt Creator, а всі зміни стосуватимуться тільки класу Widget. Додасть кнопку QPushButton через графічний дизайнер.
Widget.h
А ось і сам приклад у коді
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QSequentialAnimationGroup> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private slots: void onClickButton(); private: Ui::Widget *ui; // Группа анимации для кнопки QSequentialAnimationGroup* animationGroup; }; #endif // WIDGET_H
Widget.cpp
Важливим моментом є те, що ми створюємо QPropertyAnimation із зазначенням тієї властивості, яку потрібно анімувати. В даному випадку це "geometry" . Властивість можна анімувати, якщо вона оголошена у класі як Q_PROPERTY. Тоді виконується плавна зміна значень цієї властивості.
#include "widget.h" #include "ui_widget.h" #include <QPropertyAnimation> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // Создадим группу анимации animationGroup = new QSequentialAnimationGroup(this); // Создадим анимацию свойства передвижения слева-сверху направо-сверху QPropertyAnimation* leftTopToRightTop = new QPropertyAnimation(ui->pushButton, "geometry"); leftTopToRightTop->setDuration(1000); // Длительность анимации leftTopToRightTop->setStartValue(ui->pushButton->geometry()); // Стартовая позиция и геометрия анимации leftTopToRightTop->setEndValue(ui->pushButton->geometry().translated(100, 0)); // Конечная позиция и геометрия анимации animationGroup->addAnimation(leftTopToRightTop); // Добавим анимацию в группу // Справа-сверху вниз-справа QPropertyAnimation* rightTopToRightBottom = new QPropertyAnimation(ui->pushButton, "geometry"); rightTopToRightBottom->setDuration(1000); rightTopToRightBottom->setStartValue(leftTopToRightTop->endValue()); rightTopToRightBottom->setEndValue(leftTopToRightTop->endValue().toRect().translated(0, 100)); animationGroup->addAnimation(rightTopToRightBottom); // Снизу-справа налево-вниз QPropertyAnimation* rightBottomToLeftBottom = new QPropertyAnimation(ui->pushButton, "geometry"); rightBottomToLeftBottom->setDuration(1000); rightBottomToLeftBottom->setStartValue(rightTopToRightBottom->endValue()); rightBottomToLeftBottom->setEndValue(rightTopToRightBottom->endValue().toRect().translated(-100, 0)); animationGroup->addAnimation(rightBottomToLeftBottom); // Слева-снизу наверх-слева QPropertyAnimation* leftBottomToLeftTop = new QPropertyAnimation(ui->pushButton, "geometry"); leftBottomToLeftTop->setDuration(1000); leftBottomToLeftTop->setStartValue(rightBottomToLeftBottom->endValue()); leftBottomToLeftTop->setEndValue(rightBottomToLeftBottom->endValue().toRect().translated(0, -100)); animationGroup->addAnimation(leftBottomToLeftTop); // Подключаем нажатие кнопки к слоту обработчику кнопки connect(ui->pushButton, &QPushButton::clicked, this, &Widget::onClickButton); } Widget::~Widget() { delete ui; } void Widget::onClickButton() { // Запускаем анимацию animationGroup->start(); }
Висновок
Таким чином можна налаштувати різну анімацію для властивостей об'єкта, які позначені макросом Q_PROPERTY і мають методи set і get.