官方解析
easingCurve:QEasingCurve
这个属性保留了动画的缓和曲线。
他定义了缓和取消,默认情况下,使用线性缓和曲线,产生线性插入值。下面举出其他曲线的例子:
QEasingCurve::InCirc 这个属性提供了圆形入口曲线。
QEasingCurve::InOutElastic这个属性为插入值提供了弹性效果。
QVarantAnimation将使用QEasingCure::valueForProgress()将把动画的“常规进度”(currentTime/totalDuration)转化为动画使用的实际有效进度。当interpolated()被调用时这将会是一个有效的进度。所以keyValues里的步骤将与有效进度相关联。
缓和曲线与插入器一起使用,interpolated()这个虚函数与动画的持续时间将控制当前动画进度改变的值。
博主例子
使用QEasingCurve::InOutSine实现动态旋转
本次例子很有趣!运行截图如下:
源码如下
widget.h
1 #ifndef WIDGET_H 2 #define WIDGET_H
3
4 #include <QWidget>
5 #include <QPoint>
6
7 QT_BEGIN_NAMESPACE 8 class QPropertyAnimation; 9 QT_END_NAMESPACE 10
11 namespace Ui { 12 class Widget; 13 } 14
15 class Widget : public QWidget 16 { 17 Q_OBJECT 18 Q_PROPERTY(qreal index READ index WRITE setIndex) 19
20 public: 21 explicit Widget(QWidget *parent = 0); 22 ~Widget(); 23
24 qreal index()const; 25 void setIndex(qreal index); 26
27 protected: 28 void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE; 29
30 private: 31 Ui::Widget *ui; 32 QPropertyAnimation *m_animation; 33 QList<QWidget*> listBtn; 34 QList<QPoint> listPoint; 35
36 qreal m_index; 37 }; 38
39 #endif // WIDGET_H
main.cpp
1 #include "widget.h"
2 #include <QApplication>
3
4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 Widget w; 8 w.show(); 9
10 return a.exec(); 11 }
widget.cpp
1 #include "widget.h"
2 #include "ui_widget.h"
3
4 #include <QPropertyAnimation>
5 #include <QKeyEvent>
6 #include <QDebug>
7 #include <QtMath>
8
9 #ifndef M_PI 10 #define M_PI 3.14159265358979323846
11 #endif
12
13 Widget::Widget(QWidget *parent) : 14 QWidget(parent), 15 ui(new Ui::Widget) 16 { 17 ui->setupUi(this); 18 listBtn<<ui->pushButton; 19 listBtn<<ui->pushButton_2; 20 listBtn<<ui->pushButton_3; 21 listBtn<<ui->pushButton_4; 22
23 listPoint<<ui->pushButton->pos(); 24 listPoint<<ui->pushButton_2->pos(); 25 listPoint<<ui->pushButton_3->pos(); 26 listPoint<<ui->pushButton_4->pos(); 27
28 ui->pushButton->setFocusPolicy(Qt::NoFocus); 29 ui->pushButton_2->setFocusPolicy(Qt::NoFocus); 30 ui->pushButton_3->setFocusPolicy(Qt::NoFocus); 31 ui->pushButton_4->setFocusPolicy(Qt::NoFocus); 32
33 m_animation=new QPropertyAnimation(this,"index"); 34 m_animation->setDuration(400); 35 m_animation->setEasingCurve(QEasingCurve::InOutSine); 36
37 this->setWindowTitle("CSDN IT1995"); 38 m_index=0; 39 setIndex(0); 40 } 41
42 Widget::~Widget() 43 { 44 delete ui; 45 } 46
47 qreal Widget::index() const
48 { 49 return m_index; 50 } 51
52 void Widget::setIndex(qreal index) 53 { 54 m_index=index; 55 for(int i=0;i<listPoint.size();i++){ 56 qreal a=((i+m_index)*2*M_PI)/listBtn.count(); 57 int xs=200*qSin(a)+200; 58 int ys=200*qCos(a)+200; 59 QPointF pos(xs,ys); 60 listBtn[i]->setGeometry(xs,ys,100,50); 61 qDebug()<<listBtn[i]->pos(); 62 } 63 } 64
65 void Widget::keyPressEvent(QKeyEvent *event) 66 { 67 int delta = 0; 68 switch(event->key()) 69 { 70 case Qt::Key_Left: 71 delta = -1; 72 break; 73 case Qt::Key_Right: 74 delta = 1; 75 break; 76 default: 77 break; 78 } 79 if(m_animation->state()==QAbstractAnimation::Stopped&&delta){ 80 m_animation->setEndValue(m_index+delta); 81 m_animation->start(); 82 event->accept(); 83 } 84 }