首页 > 其他分享 >用QTimeLine实现滑动动画

用QTimeLine实现滑动动画

时间:2024-02-25 19:22:54浏览次数:21  
标签:动画 ratio void QTimeLine ui 滑动 MSlideEffect

一般在Qt实现动画可以用QAbstractAnimation的子类实现。这里给出一个不一样的例子实现动画,即用QTimeLine实现。功能是有一个QStackedWidget,它有两个子页面。默认显示第一页。点击“动画”按钮播放一段动画使页面第一页滑动到第二页,然后切换到第二页。程序测试环境是VS2017和Qt5.9。下面是程序的两张截图:

头文件:

/* 我们用视觉效果绘制两个子Widget同时出现的效果 */
class MSlideEffect : public QGraphicsEffect
{
    Q_OBJECT
    Q_PROPERTY(qreal ratio READ ratio WRITE setRatio)

public:
    MSlideEffect(QObject *parent = 0);
    void setFirstWidget(QWidget* first);
    void setSecondWidget(QWidget* second);
    qreal ratio() const;
    void setRatio(qreal ratio);

private:
    void draw(QPainter *painter) override;

private:
    qreal moveRatio; // [0,1]
    QPixmap p1;
    QPixmap p2;
};

CPP文件。下述代码中QtTest是主窗口类。为了简单在主窗口里只有一个QStackedWidget,它是ui.swSelect。ui.swPage1和ui.swPage2是ui.swSelect的两个子页面。另外,下方代码中的QTimeLine*可以手动释放,而不必等到程序结束才释放:

QtTest::QtTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

//---------------------------------------------------------------------------------------
// 播放第一页切换到第二页的滑动动画
//---------------------------------------------------------------------------------------
void QtTest::on_pbFlash_clicked()
{
    MSlideEffect* effect = new MSlideEffect(this);
    effect->setFirstWidget(ui.swPage1);
    effect->setSecondWidget(ui.swPage2);
    ui.swSelect->setGraphicsEffect(effect);

    QTimeLine* timeLine = new QTimeLine(250, this);
    timeLine->setFrameRange(0, 500);
    timeLine->setCurveShape(QTimeLine::EaseInOutCurve);
    connect(timeLine, &QTimeLine::frameChanged, this, 
        [effect](int frame) { effect->setRatio(frame / 500.0); });
    connect(timeLine, &QTimeLine::finished, this,
        [this]() { ui.swSelect->setCurrentIndex(1); ui.swSelect->setGraphicsEffect(0); });
    timeLine->start();

    /* 播放动画的时候隐藏它们 */
    /* 因为在某些情况下它会影响动画显示 */
    ui.swPage1->hide();
    ui.swPage2->hide();
}

/////////////////////////////////////////////////////////////////////////////////////////

MSlideEffect::MSlideEffect(QObject *parent) : 
    QGraphicsEffect(parent)
{
    moveRatio = 0;
}

void MSlideEffect::setFirstWidget(QWidget* first)
{
    p1 = first->grab();
}

void MSlideEffect::setSecondWidget(QWidget* second)
{
    second->resize(p1.size());
    p2 = second->grab();
}

void MSlideEffect::draw(QPainter *painter)
{
    int full = p1.width();
    int offset = int(full * moveRatio);
    painter->translate(-offset, 0);
    painter->drawPixmap(0, 0, p1);
    painter->drawPixmap(full, 0, p2);
}

qreal MSlideEffect::ratio() const
{
    return moveRatio;
}

void MSlideEffect::setRatio(qreal ratio)
{
    moveRatio = ratio;
    update();
}

 

标签:动画,ratio,void,QTimeLine,ui,滑动,MSlideEffect
From: https://www.cnblogs.com/mengxiangdu/p/17921610.html

相关文章

  • 3-3. 野猪-受伤及死亡的逻辑和动画
    制作受伤和死亡动画受伤动画死亡动画就是在受伤动画基础上,增加Color.a从1~0的变化动画状态机如下当hurt触发的时候,从AnyState立刻进入boarHurt,当boarHurt播放完一帧之后进入Exit当dead=true的时候,从AnyState立刻进入boarDead注意,从AnyState出......
  • powerpoint: 设置幻灯片的切换动画
    一,选择切换动画选中要切换的幻灯片    然后选择工具栏上的切换标签,   选择一个切换动画:说明:刘宏缔的架构森林—专注it技术的博客,网址:https://imgtouch.com本文: https://blog.imgtouch.com/index.php/2024/02/24/powerpoint-she-zhi-huan-deng-pian-de-qi......
  • 3-1. 野猪 - 基本的移动逻辑和动画
    野猪实现移动添加一个Enemy类usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassEnemy:MonoBehaviour{protectedRigidbody2Drb;protectedAnimatoranim;[Header("基本参数")]publicfloatnormalSpe......
  • 2-12. 三段攻击动画的实现
    创建动画片段修改动画状态机增加AttackLayer,把刚才制作好的动画片段加进去再增加两个变量,bool类型的isAttack和trigger类型的attackNewState->blueAttack1,isAttack=true并且attack触发blueAttack1->blueAttack2,isAttack=true并且attack触发,有exi......
  • 2-11. 受伤和死亡的逻辑和动画
    添加受伤和死亡动画片段通过新的层来实现受伤和死亡动画点击动画控制器右上角的+,然后新建一个Layer注意Weight要改成1,Blending要改成Additive受伤的话,我们通过hurt来触发,死亡我们通过isDead来控制在HurtLayer中,当hurt触发的时候,就会播放blueHurt动画,......
  • 2-9. 实现人物下蹲逻辑和动画
    动画片段做成动画片段,命名为blueCrouchStart和blueCrouchIdle动画状态机这里我们再接触一个新的东西,Sub-StateMachine,可以通过右键CreateSub-StateMachine来实现点开Crouch,把之前创建好的blueCrouchStart和blueCrouchIdle片段加进来另外添加一个变量,isCrouc......
  • 2-8. 创建人物跳跃动画
    人物跳跃的五个阶段根据这张图把图片切好,并做好动画状态使用BlendTree实现跳跃动画在动画状态机中新建一个BlendTree,然后给它添加三个Motion因为我设置的JumpForce是5,所以人物速度54时候是起跳阶段,41的时候是上升阶段,1~-1的时候是空中换腿阶段,-1以后是下降阶段。虽然......
  • 2-6. 创建人物基本动画
    给帧图片命名添加动画首先需要给Player添加Animator组件然后创建Animations/Player文件夹,并在该文件夹下面添加AnimatorController,起名叫Player然后把Player拖到Animator的Controller上面打开动画状态机Window->Animation->Animator创建Idle动......
  • css 动画
    <divclass="quan-box">逐渐放大消失<div>  /*申明一个div的class用于执行动画*/.quan-box{opacity:0;background:#70D97C;position:absolute;//3秒执行完成quan动画,infinite动画会无限次重复播放,steps(40)表示将整个动画过程分割成40个......
  • three-第三方动画库-让物体动起来更简单(gsap)
    gsap介绍:GreenSockAnimationPlatform(GSAP)是一个业界知名的动画库,它被1100多万个网站使用,有超过50%的获奖的网站都是用了它。不管是在原生环境中,还是任意的框架中,你可以使用GSAP去让非常多的东西动起来。不管你是想要去让UI界面产生交互动画,还是SVG图形产生动画,甚至是Three......