Pull to refresh

Qt Animation Framework

Reading time2 min
Views4.1K
С появлением Qt 4.6 реализация анимации в проекте упростилась до минимума.

В том случае, когда необходима анимация свойств компонента, Qt 4.6 предлагает воспользоваться классом QPropertyAnimation. Вот пример анимации изменения размера виджета:

  1. #include <QWidget>
  2. #include <QPropertyAnimation>
  3. #include <QEasingCurve>
  4.  
  5. class MyWidget : public QWidget {
  6. public:
  7.   MyWidget(QObject* parent = 0);
  8.   // MyWidget fields and methods
  9. public slots:
  10.   void startAnimation();
  11. private:
  12.   QPropertyAnimation* _propertyAnimation;
  13. };
* This source code was highlighted with Source Code Highlighter.


  1. MyWidget::MyWidget(QObject *parent) : QWidget(parent) {
  2.   // Widget initialization
  3.   _propertyAnimation = new QPropertyAnimation(this,"geometry");
  4.   _propertyAnimation->setDuration(1000);
  5.   _propertyAnimation->setEasingCurve(QEasingCurve::OutCubic);
  6. }
  7.  
  8. void MyWidget::startAnimation() {
  9.   QRectF firstPosition;
  10.   QRectF endPosition;
  11.   // Initializing first and end values
  12.   _propertyAnimation->setFirstValue(firstPosition);
  13.   _propertyAnimation->setEndValue(endPosition);
  14.   _propertyAnimation->start();
  15. }
* This source code was highlighted with Source Code Highlighter.


С помощью метода setDuration(int) задаётся продолжительность анимации, а с помощью метода setEasingCurve(const QEasingCurve&) задается кривая изменения значения с течением времени. В данном примере выбрана кривая OutQuad


Собственно, 6 строчек и все.

Для анимации значения не являющегося свойством можно отнаследоваться от QVariantAnimation и переопределить метод void updateCurrentValue(const QVariant&). В этом методе необходимо описать логику того что должно произойти при изменении значения.

QVariantAnimation поддерживает следующие типы: Int, Double, Float, QLine, QLineF, QPoint, QSize, QSizeF, QRect,QRectF. Если тип изменяемого значения не принадлежит ни одному из вышеперечисленных — надо переопределить метод интерполяции virtual QVariant interpolated ( const QVariant & from, const QVariant & to, qreal progress ) const

Вот пример того что получилось:
Tags:
Hubs:
Total votes 10: ↑9 and ↓1+8
Comments1

Articles