zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    CVPR2020:三维实例分割与目标检测
    CVPR2020:视觉导航的神经拓扑SLAM
    使用现代C++如何避免bugs(下)
    使用现代C++如何避免bugs(上)
    蓝牙mesh网络技术的亮点
    电路功能和优点
    ARM的突破:超级计算机和Mac
    所有处理都走向AI
    Wide-Bandgap宽禁带(WBG)器件(如GaN和SiC)市场将何去何从?
    功率半导体碳化硅(SiC)技术
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14931132.html
Copyright © 2011-2022 走看看