QWidget
作为paintEvent
函数,负责绘图。要正确实现此功能,QStyle
对象用于表示每个组件,QStyleOption
对象用于保存控件的状态。
例如:自定义ScrollBar
实施他的paintEvent
,使用选项" drawComplexControl
"来调用CC_ScrollBar
。然后,可以扩展QProxyStyle
以更改滚动条的外观。
当用户悬停滑块时,会调用paintEvent
来应用新的" hovered"外观,哪个状态保存在QStyleOption::state
中。但是对于现在的一天小部件,这个状态不应该立即更新,而是在大约100-500毫秒的平滑过渡(动画)。为了使用此转换为窗口小部件设置动画,需要一些值,例如动画的当前状态(qreal
/ QColor
?),用于滚动的每个部分:顶部箭头,底部箭头或滑块
此后"长"介绍,我的问题来了:
是否有某个变量来设置动画的状态?我可以使用这个新值扩展QStyleOption
,但当前的实现似乎已经包含动画,我无法找到保存此转换状态的位置。
我正在寻找一个规范的答案。
注意:为了避免"可能重复...",即使稍微相关,这也不是关于如何使用QAnimation或创建自定义小部件的问题。
答案 0 :(得分:4)
样式动画源自私人QStyleAnimation
(#include "qstyleanimation_p.h"
),它们是QAbstractAnimation
,因此QObject
。例如,滚动条样式动画是QScrollbarStyleAnimation
。
以下是Windows样式的drawControl
如何获取动画的指针:
if (QProgressStyleAnimation *animation =
qobject_cast<QProgressStyleAnimation*>(d->animation(opt->styleObject)))
各种样式对象的动画由样式PIMPL's animation
,startAnimation
和stopAnimation
方法管理。定义这些方法的基础PIMPL是QCommonStylePrivate
(#include <private/qcommonstyle_p.h>
)。
你以自己的风格使用它的方式是:
从QCommonStyle
派生您的风格,使用PIMPL惯用语,并从QCommonStylePrivate
派生您的pimpl。我documented the Qt's PIMPL idiom让它变得更容易。
重复使用其中一个现有的样式动画类,或者使用QStyleAnimation
派生自己的动画类。
利用QCommonStyle
PIMPL的方法管理动画。不过,首先要创建动画实例。