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

Adr*_*ire 5 c++ qt qwidget transitions qstyle

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

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

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


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

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

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

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

Rei*_*ica 4

样式动画源自 private QStyleAnimation( #include "qstyleanimation_p.h"),因此它们是QAbstractAnimation,因此QObject。例如,滚动条样式动画是QScrollbarStyleAnimation.

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

if (QProgressStyleAnimation *animation = 
  qobject_cast<QProgressStyleAnimation*>(d->animation(opt->styleObject)))
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 从 派生您的风格QCommonStyle,使用 PIMPL 习惯用法,并从 派生您的 pimpl QCommonStylePrivate。我已经记录了 Qt 的 PIMPL 习惯用法,以使其更容易。

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

  3. 利用QCommonStylePIMPL 的方法来管理动画。不过,首先需要您创建动画实例。