在哪里保存 QWidget 动画的状态以便在 QStyle 绘制函数中使用?

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

一个QWidget作为一个paintEvent函数负责他的绘图。为了正确实现这个功能,用一个QStyle对象来表示每个组件,用一个QStyleOption对象来保存控件的状态。

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

当用户悬停滑块时,调用 paintEvent 应用新的 "hovered" 外观,该状态保存在 QStyleOption::state 中。但是对于现在一天的小部件,这种状态不应该立即更新,而是在大约 100-500 毫秒内平滑过渡(动画)。为了使用此转换为小部件设置动画,需要一些值,例如滚动的每个部分的动画的当前状态(qreal/QColor?):顶部箭头、底部箭头或滑块.


经过这个"long"的介绍,我的问题来了:

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

我正在寻找规范的答案。

注意:为避免"possible duplicate of...",即使稍微相关,这也不是关于如何使用 QAnimation 或创建自定义 Widget 的问题。

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

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

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

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

您可以按照自己的风格使用它:

  1. QCommonStyle 中获取你的风格,使用 PIMPL 惯用法,并从 QCommonStylePrivate 中获取你的 pimpl。我 documented the Qt's PIMPL idiom 让它更容易。

  2. 重用现有样式动画之一 类,或使用从 QStyleAnimation.

  3. 派生的样式
  4. 利用 QCommonStyle PIMPL 的方法来管理动画。不过,您首先要创建动画实例。