QT之QPropertyAnimation详细介绍

此篇文章来源于自己学习Qt的QPropertyAnimation类时总结的知识点,本人能力有限,欢迎大家评论区评论,大家共同学习,共同进步。

一、QPropertyAnimation介绍

QPropertyAnimation是Qt框架中用于实现属性动画的类,它允许你对QObject或其派生类的任何可读写属性进行动画处理。通过QPropertyAnimation,你可以创建平滑、连续的动画效果,比如控件的位置、大小、颜色等属性的变化。

使用QPropertyAnimation的基本步骤如下:

  1. 创建QPropertyAnimation对象,并指定要进行动画的QObject及其属性名。
  2. 设置动画的开始和结束值(可以是绝对值,也可以是相对变化)。
  3. 设置动画的持续时间和其他动画曲线参数(如缓动函数)。
  4. 开始动画,调用start()方法。

例如:

QPropertyAnimation *animation = new QPropertyAnimation(myObject, "geometry");
animation->setStartValue(QRect(0, 0, 100, 100));
animation->setEndValue(QRect(200, 200, 100, 100));
animation->setDuration(1000);
animation->start();

在这个例子中,我们创建了一个动画对象,该动画将改变myObject的"geometry"属性(即位置和大小),使其在1秒内从(0,0,100,100)移动并变化到(200,200,100,100)。

此类基本都是继承于QVariantAnimation类进行操作

关于QVariantAnimation在另外一篇文章进行讲解,大家可以去另外一篇文章查看详细的介绍

二、成员函数

1、QPropertyAnimation::QPropertyAnimation(QObject *target, const QByteArray &propertyNameQObject *parent = nullptr)

这个构造函数是用来创建一个 QPropertyAnimation 对象实例,它的主要作用是初始化一个动画,该动画将影响给定 target 对象的特定 propertyName 属性。

参数说明:

  • target: 指向一个QObject或其子类的对象指针,这个对象就是动画所作用的目标对象。
  • propertyName: 一个 QByteArray 类型变量,它包含了要被动画化的属性名称,这个属性必须是在 target 对象上存在的,且应当遵循Qt属性系统的规则,可以使用 Q_PROPERTY宏声明过。
  • parent: 可选参数,指向QObject的一个父对象,用于构成Qt的父对象-子对象层次结构,以便于内存管理和事件传播。如果省略,默认值为 nullptr,即没有父对象。

举例说明,如果我们有一个自定义的QWidget派生类 MyWidget,并且在其中声明了名为 "position" 的可动画属性,我们可以这样创建一个动画:

MyWidget *widget = new MyWidget();
QPropertyAnimation *animation = new QPropertyAnimation(widget, "position");

这段代码将创建一个针对 widget 的位置属性进行动画的实例。接下来可以通过设置动画的关键帧、持续时间等属性来实现该属性值随时间平滑变化的效果。

2、QPropertyAnimation::QPropertyAnimation(QObject *parent = nullptr)

这个构造函数是 QPropertyAnimation 类的一个简化版本,它允许不直接指定目标对象和属性名称来创建一个动画实例。创建时仅传入一个可选参数 parent,用于构建Qt对象树的父对象关系。

然而,当仅使用此构造函数创建 QPropertyAnimation 实例后,还必须调用 setTargetObject() 方法来设置动画的目标对象,并通过 setPropertyName() 方法来指定要改变的属性名,才能真正使动画生效。

QPropertyAnimation *animation = new QPropertyAnimation(nullptr); // 创建动画实例,但尚未关联任何目标对象和属性
MyWidget *widget = new MyWidget();
animation->setTargetObject(widget); // 设置目标对象
animation->setPropertyName("position"); // 设置要动画化的属性名
// 进一步配置动画(如设置关键帧、持续时间等)

只有在完成这些附加步骤之后,动画才能正确地应用于指定的QObject及其属性。

3、bool QPropertyAnimation::event(QEvent *event)

bool QPropertyAnimation::event(QEvent *event) 是 Qt 框架中的一个虚拟函数,它是 QObject 类提供的事件处理机制的一部分。QPropertyAnimation 类重载了这个函数,以便能够处理特定类型的事件,不过在标准 Qt 文档中并没有明确说明 QPropertyAnimation 是否有特别针对某些事件进行了自定义处理。

通常情况下,event() 函数会在 QObject 或其子类接收到事件时被调用。如果 QPropertyAnimation 对于某些特定事件进行了特殊处理,那么该函数会检查传入的 QEvent 类型,并执行相应的操作。对于没有特殊处理的事件,它可能直接调用基类 QObject::event(event) 来进行默认处理。

由于 QPropertyAnimation 的主要职责是管理对象属性的动画变化,而不是直接与用户界面交互(尽管它可以间接影响界面),因此,它对事件处理的需求可能不如其他直接涉及用户输入或窗口管理的类那样频繁。若要了解 QPropertyAnimation 中 event() 函数的具体实现细节和用途,建议查阅官方Qt文档或查看Qt源代码。

4、void QPropertyAnimation::updateCurrentValue(const QVariant &value)

void QPropertyAnimation::updateCurrentValue(const QVariant &value) 是 Qt 动画框架中的一个函数,用于手动设置 QPropertyAnimation 当前的动画值。这个函数允许开发者在动画运行过程中或者动画外部直接更新动画所作用的对象的属性值。

QPropertyAnimation 通常用来创建平滑的属性过渡动画,从起始值到终止值。然而,在某些情况下,可能需要临时或立即改变动画中间过程中的属性值,这时就可以使用 updateCurrentValue() 函数。

  • value: 这是要更新的属性的新值,类型为 QVariant,它可以封装任何支持 Qt 属性系统 (Q_PROPERTY) 的数据类型。

通过调用此函数,动画将会立即应用指定的 value 到目标对象的相关属性上,而不论当前动画的时间进度如何。这可以用于动态调整动画路径或者响应外部事件来即时改变动画状态。

5、void QPropertyAnimation::updateState(QAbstractAnimation::State newStateQAbstractAnimation::State oldState)

void QPropertyAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) 是Qt动画框架中 QPropertyAnimation 类的一个虚拟保护成员函数。当动画的状态发生变化时,该函数会被调用。它允许子类根据动画状态的变化执行特定的操作。

  • newState: 表示动画即将进入的新状态,这是 QAbstractAnimation::State 枚举类型的一个值,可能包括 RunningStoppedPaused 等状态。
  • oldState: 表示动画正在离开的旧状态,同样是 QAbstractAnimation::State 枚举类型的一个值。

虽然这个函数在 QPropertyAnimation 中是虚函数(virtual),意味着子类可以重写它以实现自定义行为,但通常开发人员不会直接调用这个函数,而是通过控制动画的开始、停止和暂停等操作间接触发状态变更。这个函数主要用于内部状态管理以及给那些想要扩展动画类功能的开发者提供一个钩子(hook)。

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值