Qt easingCurve:QEasingCurve官方解析及实例

官方解析
easingCurve:QEasingCurve

这个属性保留了动画的缓和曲线。
他定义了缓和取消,默认情况下,使用线性缓和曲线,产生线性插入值。下面举出其他曲线的例子:
QEasingCurve::InCirc 这个属性提供了圆形入口曲线。
QEasingCurve::InOutElastic这个属性为插入值提供了弹性效果。
QVarantAnimation将使用QEasingCure::valueForProgress()将把动画的“常规进度”(currentTime/totalDuration)转化为动画使用的实际有效进度。当interpolated()被调用时这将会是一个有效的进度。所以keyValues里的步骤将与有效进度相关联。
缓和曲线与插入器一起使用,interpolated()这个虚函数与动画的持续时间将控制当前动画进度改变的值。

博主例子
使用QEasingCurve::InOutSine实现动态旋转

本次例子很有趣!运行截图如下:
Qt easingCurve:QEasingCurve官方解析及实例

 源码如下
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 }

 

Qt easingCurve:QEasingCurve官方解析及实例

上一篇:常用工具-notepad++打开大文件卡死现象


下一篇:浅析装饰器及在React中的应用