在何处保存 QWidget 动画的状态以在 QStyle 绘制函数中使用

Where to save the state of QWidget animations for use in QStyle draw functions?

本文关键字:绘制 QStyle 函数 QWidget 保存 动画 状态 在何处      更新时间:2023-10-16

QWidget作为paintEvent函数,负责绘制。若要正确实现此函数,请使用一个 QStyle 对象来表示每个组件,并使用一个QStyleOption对象来保存控件的状态。

例如:一个自定义ScrollBar实现他的paintEvent,它用选项"CC_ScrollBar"调用drawComplexControl。然后,可以扩展QProxyStyle以更改滚动条的外观。

当用户将鼠标悬停在滑块上时,调用paintEvent应用新的"悬停"外观,该状态保存在QStyleOption::state中。但是就目前而言,这种状态不应该立即更新,而是在大约 100-500 毫秒内平滑过渡(动画)。为了使用这种过渡对小部件进行动画处理,需要一些值,例如滚动每个部分的动画的当前状态(qreal/QColor ?):顶部箭头,底部箭头或滑块。


在这个"长"的介绍之后,我的问题来了:

是否有变量可以设置此动画的状态?我可以使用这个新值扩展QStyleOption,但当前的实现似乎已经包含动画,我找不到保存此过渡状态的位置。

我正在寻找一个规范的答案。

注意:为了避免"可能重复...",即使稍微相关,这不是关于如何使用QAnimation或创建自定义小部件的问题。

样式动画派生自私有QStyleAnimation#include "qstyleanimation_p.h"),它们是QAbstractAnimation的,因此QObject。例如,滚动条样式动画是QScrollbarStyleAnimation

下面是 Windows 样式的drawControl获取指向动画的指针的方式:

if (QProgressStyleAnimation *animation = 
  qobject_cast<QProgressStyleAnimation*>(d->animation(opt->styleObject)))

各种样式对象的动画由样式 PIMPL 的animationstartAnimationstopAnimation方法管理。定义这些方法的基本 PIMPL 是 QCommonStylePrivate#include <private/qcommonstyle_p.h> )。

您以自己的风格使用它的方式是:

  1. QCommonStyle派生你的风格,使用PIMPL成语,并从QCommonStylePrivate派生你的痘痘。我已经记录了Qt的PIMPL习语,以使其更容易。

  2. 重用现有的样式动画类之一,或使用从QStyleAnimation派生自己的样式动画类。

  3. 利用 PIMPL QCommonStyle方法来管理动画。不过,首先创建动画实例取决于您。