在何处保存 QWidget 动画的状态以在 QStyle 绘制函数中使用
Where to save the state of QWidget animations for use in QStyle draw functions?
QWidget
作为paintEvent
函数,负责绘制。若要正确实现此函数,请使用一个 QStyle
对象来表示每个组件,并使用一个QStyleOption
对象来保存控件的状态。
例如:一个自定义ScrollBar
实现他的paintEvent
,它用选项"CC_ScrollBar
"调用drawComplexControl
。然后,可以扩展QProxyStyle
以更改滚动条的外观。
当用户将鼠标悬停在滑块上时,调用paintEvent
应用新的"悬停"外观,该状态保存在QStyleOption::state
中。但是就目前而言,这种状态不应该立即更新,而是在大约 100-500 毫秒内平滑过渡(动画)。为了使用这种过渡对小部件进行动画处理,需要一些值,例如滚动每个部分的动画的当前状态(qreal
/QColor
?):顶部箭头,底部箭头或滑块。
在这个"长"的介绍之后,我的问题来了:
是否有变量可以设置此动画的状态?我可以使用这个新值扩展QStyleOption
,但当前的实现似乎已经包含动画,我找不到保存此过渡状态的位置。
我正在寻找一个规范的答案。
注意:为了避免"可能重复...",即使稍微相关,这不是关于如何使用QAnimation或创建自定义小部件的问题。
样式动画派生自私有QStyleAnimation
(#include "qstyleanimation_p.h"
),它们是QAbstractAnimation
的,因此QObject
。例如,滚动条样式动画是QScrollbarStyleAnimation
。
下面是 Windows 样式的drawControl
获取指向动画的指针的方式:
if (QProgressStyleAnimation *animation =
qobject_cast<QProgressStyleAnimation*>(d->animation(opt->styleObject)))
各种样式对象的动画由样式 PIMPL 的animation
、startAnimation
和stopAnimation
方法管理。定义这些方法的基本 PIMPL 是 QCommonStylePrivate
(#include <private/qcommonstyle_p.h>
)。
您以自己的风格使用它的方式是:
从
QCommonStyle
派生你的风格,使用PIMPL成语,并从QCommonStylePrivate
派生你的痘痘。我已经记录了Qt的PIMPL习语,以使其更容易。重用现有的样式动画类之一,或使用从
QStyleAnimation
派生自己的样式动画类。利用 PIMPL
QCommonStyle
方法来管理动画。不过,首先创建动画实例取决于您。
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- SFML 文本未绘制在窗口上
- 如何在快板的屏幕中显示子位图的绘制?
- 如何绘制自定义形状的元素?
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 绘制文本问题
- 在 QT C++中绘制/操作多边形
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 在现代OpenGL中,绘制GL_TRIANGLE奇怪的z轴行为的填充圆
- 绘制QStyleOptionButton QStyle::CE_CheckBox背景的方法是什么
- 在何处保存 QWidget 动画的状态以在 QStyle 绘制函数中使用