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

本文深入探讨了Qt中动画的实现方式,特别是缓和曲线(Easing Curve)的应用。通过详细解析QEasingCurve的不同类型,如InCirc、InOutElastic及InOutSine,并附上了一个动态旋转按钮的实例,展示了如何利用缓和曲线创造更流畅的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

官方解析

博主例子


官方解析

easingCurve:QEasingCurve

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

博主例子

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值