gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:09 25 4
gpt4 key购买 nike

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

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

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


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

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

我正在寻找规范的答案。

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

最佳答案

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

Windows 风格的 drawControl 是这样的获取指向动画的指针:

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

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

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

  1. QCommonStyle 导出您的风格,使用 PIMPL 习语,并从 QCommonStylePrivate 派生你的 pimpl .我有 documented the Qt's PIMPL idiom让它变得更容易。

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

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

关于c++ - 在哪里保存 QWidget 动画的状态以便在 QStyle 绘制函数中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30974434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com