QT中QWidget通过使用QPropertyAnimation实现下拉动画

2022年2月25日 4731点热度 4人点赞 3条评论

QPropertyAnimation

QPropertyAnimaiton依托与QT的Property系统,使用时只需要提供一个QWidget对象,然后设置好控制动画的Property名称,再为这个属性设置好变化范围,最后调整动画的播放时间,调用start()函数就可以实现动画。

void setPropertyName(const QByteArray &propertyName)

这个函数的功能是为动画设置一个property参数,这个property需要执行表演的Widget对象包含,这里只需要传入property的名称即可。

这里是原生的QWidget支持的属性参数。

这些属性信息都可以在Qt help中查到,当然除了原生的property,用户添加的peoperty也是可以的。

注意

只有特定数据类型的property可以作为动画参数使用,目前支持的数据类型有Int、UInt、Double、Float、QLine、QLineF、QPoint、QPointF、QSize、QSizeF、QRect、QRectF、QColor

void setStartValue(const QVariant &value);
void setEndValue(const QVariant &value);

这两个函数用于设置参数的变化范围,列如需要使用pos参数实现一个窗口慢慢移动的动画,那么就要使用它们设置好起点和终点。

//用于设置动画的播放时间
void setDuration(int msecs);

知道以上的知识之后,就可以实现动画功能了,当然QT提供了相当多的接口用于用户完善动画的接口,这里只记录了一部分,全部内容可以移步到QT help查看。

示例

.h

#pragma  once
#include <QWidget>
#include <QPropertyAnimation>
#include <QMouseEvent>
#include <QResizeEvent>

class DrawerWidget;
class AnimationWidget :public QWidget {
public:
    AnimationWidget(QWidget* parent = 0);
    ~AnimationWidget();

protected:
    void resizeEvent(QResizeEvent* event) override;
    void enterEvent(QEvent* event);
    void leaveEvent(QEvent* event);
private:
    DrawerWidget* drawerWidget; //下滑窗口

};

class DrawerWidget :public QWidget {
public:
    DrawerWidget(QWidget* parent = 0);
    ~DrawerWidget();

    //弹出与收回
    void pop();
    void push();
protected:
    void resizeEvent(QResizeEvent* event) override;
private:
    QPropertyAnimation* pushAnimation, * popAnimation;

};

 

.cpp

#include "AnimationWidget.h"
AnimationWidget::AnimationWidget(QWidget* parent /*= 0*/)
    :QWidget(parent)
{
    //初始化成员
    drawerWidget = new DrawerWidget(this);
    auto size = this->size();
    size.setHeight(30);
    drawerWidget->setFixedSize(size);

    //为head增加背景颜色 
    drawerWidget->setStyleSheet("background-color: rgb(255, 85, 0);");

    //开启鼠标追踪
    setMouseTracking(true);

}

AnimationWidget::~AnimationWidget()
{
    delete drawerWidget;
}

void AnimationWidget::resizeEvent(QResizeEvent* event)
{
    QWidget::resizeEvent(event);
    auto size = this->size();
    size.setHeight(30);
    drawerWidget->setFixedSize(size);
}

void AnimationWidget::enterEvent(QEvent* event)
{
    QWidget::enterEvent(event);
    drawerWidget->pop();
}

void AnimationWidget::leaveEvent(QEvent* event)
{
    QWidget::leaveEvent(event);
    drawerWidget->push();
}

DrawerWidget::DrawerWidget(QWidget* parent /*= 0*/)
    :QWidget(parent)
{
    popAnimation = new QPropertyAnimation(this, "pos");
    popAnimation->setDuration(500);
    pushAnimation = new QPropertyAnimation(this, "pos");
    pushAnimation->setDuration(500);

}

DrawerWidget::~DrawerWidget()
{
    delete popAnimation;
    delete pushAnimation;
}

void DrawerWidget::pop()
{
    if (popAnimation->state() == QPropertyAnimation::Running)
        return;
    if (pushAnimation->state() == QPropertyAnimation::Running)
        pushAnimation->stop();
    auto p = this->pos();
    popAnimation->setStartValue(p);
    p.setY(0);
    popAnimation->setEndValue(p);
    popAnimation->start();
}

void DrawerWidget::push()
{
    if (pushAnimation->state() == QPropertyAnimation::Running)
        return;
    if (popAnimation->state() == QPropertyAnimation::Running)
        popAnimation->stop();
    auto p = this->pos();
    pushAnimation->setStartValue(p);
    p.setY(-this->height());
    pushAnimation->setEndValue(p);
    pushAnimation->start();
}

void DrawerWidget::resizeEvent(QResizeEvent* event)
{
    QWidget::resizeEvent(event);

}

 

大脸猫

这个人虽然很勤快,但什么也没有留下!

文章评论

  • Duffy

    有源码吗?楼主 想学习一下 多谢

    2023年7月31日
    • 大脸猫

      @Duffy 示例中贴的代码就是完整代码,可以直接复制使用!

      2023年7月31日
  • Duffy

    有源码吗 楼主

    2023年7月31日