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

时间:2015-06-22 07:41:28

标签: c++ qt transitions qwidget qstyle

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

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

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

此后"长"介绍,我的问题来了:

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

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

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

1 个答案:

答案 0 :(得分:4)

样式动画源自私人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. 利用QCommonStyle PIMPL的方法管理动画。不过,首先要创建动画实例。