目录

官方解析

博主例子


官方解析

easingCurve:QEasingCurve

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

博主例子

使用QEasingCurve::InOutSine实现动态旋转

本次例子很有趣!运行截图如下:

Qt文档阅读笔记-easingCurve:QEasingCurve官方解析及实例

源码如下
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPoint>

QT_BEGIN_NAMESPACE
class QPropertyAnimation;
QT_END_NAMESPACE

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(qreal index READ index WRITE setIndex)

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    qreal index()const;
    void setIndex(qreal index);

protected:
    void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;

private:
    Ui::Widget *ui;
    QPropertyAnimation *m_animation;
    QList<QWidget*> listBtn;
    QList<QPoint> listPoint;

    qreal m_index;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QPropertyAnimation>
#include <QKeyEvent>
#include <QDebug>
#include <QtMath>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    listBtn<<ui->pushButton;
    listBtn<<ui->pushButton_2;
    listBtn<<ui->pushButton_3;
    listBtn<<ui->pushButton_4;

    listPoint<<ui->pushButton->pos();
    listPoint<<ui->pushButton_2->pos();
    listPoint<<ui->pushButton_3->pos();
    listPoint<<ui->pushButton_4->pos();

    ui->pushButton->setFocusPolicy(Qt::NoFocus);
    ui->pushButton_2->setFocusPolicy(Qt::NoFocus);
    ui->pushButton_3->setFocusPolicy(Qt::NoFocus);
    ui->pushButton_4->setFocusPolicy(Qt::NoFocus);

    m_animation=new QPropertyAnimation(this,"index");
    m_animation->setDuration(400);
    m_animation->setEasingCurve(QEasingCurve::InOutSine);

    this->setWindowTitle("CSDN IT1995");
    m_index=0;
    setIndex(0);
}

Widget::~Widget()
{
    delete ui;
}

qreal Widget::index() const
{
    return m_index;
}

void Widget::setIndex(qreal index)
{
    m_index=index;
    for(int i=0;i<listPoint.size();i++){
        qreal a=((i+m_index)*2*M_PI)/listBtn.count();
        int xs=200*qSin(a)+200;
        int ys=200*qCos(a)+200;
        QPointF pos(xs,ys);
        listBtn[i]->setGeometry(xs,ys,100,50);
        qDebug()<<listBtn[i]->pos();
    }
}

void Widget::keyPressEvent(QKeyEvent *event)
{
    int delta = 0;
    switch(event->key())
    {
    case Qt::Key_Left:
        delta = -1;
        break;
    case  Qt::Key_Right:
        delta = 1;
        break;
    default:
        break;
    }
    if(m_animation->state()==QAbstractAnimation::Stopped&&delta){
        m_animation->setEndValue(m_index+delta);
        m_animation->start();
        event->accept();
    }
}

 

相关文章:

  • 2021-10-09
  • 2021-08-03
  • 2021-06-10
  • 2021-05-24
  • 2021-06-22
  • 2021-11-24
  • 2022-12-23
  • 2021-11-27
猜你喜欢
  • 2021-08-27
  • 2021-08-28
  • 2021-11-11
  • 2021-12-10
  • 2021-08-19
  • 2021-08-23
  • 2021-11-13
相关资源
相似解决方案