Qt easingCurve:QEasingCurve官方解析及實例


官方解析
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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM