Visindigo::Widgets::LiquidGlassEffect Class
class Visindigo::Widgets::LiquidGlassEffect一个提供液态玻璃效果的图形效果类. 详情...
| 头文件: | #include <Widgets/LiquidGlassEffect.h> |
| 自以下版本: | Visindigo 0.13.0 |
公开类型
(自 Visindigo 0.13.0 引入) enum class | BackgroundPolicy { Render, CustomImage } |
(自 Visindigo 0.13.0 引入) enum class | EffectType { NormalDistort, Blur, RimLight, GlobalRim, DispersionDistort, All } |
| flags | EffectTypes |
(自 Visindigo 0.13.0 引入) enum class | PositionPolicy { ParentLocalGeometry, ParentGlobalGeometry, CustomGeometry } |
公开成员函数
(自 Visindigo 0.13.0 引入) | LiquidGlassEffect(QWidget *parent = nullptr) |
(自 Visindigo 0.13.0 引入) | ~LiquidGlassEffect() |
(自 Visindigo 0.13.0 引入) virtual void | draw(QPainter *painter) override |
(自 Visindigo 0.17.0 引入) virtual bool | eventFilter(QObject *watched, QEvent *event) override |
(自 Visindigo 0.13.0 引入) void | setBackgroundImage(const QImage &image) |
(自 Visindigo 0.13.0 引入) void | setBackgroundPolicy(Visindigo::Widgets::LiquidGlassEffect::BackgroundPolicy policy) |
(自 Visindigo 0.13.0 引入) void | setBlurRadius(int radius) |
(自 Visindigo 0.13.0 引入) void | setBorderRadius(int radius) |
(自 Visindigo 0.15.0 引入) void | setColorMask(const QColor &color, qreal percent) |
(自 Visindigo 0.13.0 引入) void | setCustomGeometry(const QRect &geometry) |
(自 Visindigo 0.13.0 引入) void | setEffectTypes(Visindigo::Widgets::LiquidGlassEffect::EffectTypes effects) |
(自 Visindigo 0.17.0 引入) void | setGlobalRimLightColor(const QColor &color) |
(自 Visindigo 0.17.0 引入) void | setGlobalRimLightDirection(const QPointF &direction) |
(自 Visindigo 0.17.0 引入) void | setGlobalRimLightThickness(int thickness) |
(自 Visindigo 0.17.0 引入) void | setGlobalRimShadowColor(const QColor &color) |
(自 Visindigo 0.17.0 引入) void | setGlobalRimShadowThickness(int thickness) |
(自 Visindigo 0.17.0 引入) void | setLiquidDistortDispersion(qreal dispersion) |
(自 Visindigo 0.13.0 引入) void | setLiquidDistortRadius(int radius) |
(自 Visindigo 0.13.0 引入) void | setPositionPolicy(Visindigo::Widgets::LiquidGlassEffect::PositionPolicy policy) |
(自 Visindigo 0.17.0 引入) void | setRimLightActivationDistance(int distance) |
(自 Visindigo 0.17.0 引入) void | setRimLightColor(const QColor &color) |
(自 Visindigo 0.17.0 引入) void | setRimLightRange(int range) |
(自 Visindigo 0.17.0 引入) void | setRimLightThickness(int thickness) |
静态公开成员
(自 Visindigo 0.13.0 引入) QImage | blurImage(const QImage &image, int radius) |
(自 Visindigo 0.15.0 引入) QImage | colorMaskImage(const QImage &image, const QColor &color, qreal percent) |
(自 Visindigo 0.13.0 引入) QImage | distortImage(const QImage &coverdArea, int liquidDistortRadius, qreal dispersion = 0.0) |
(自 Visindigo 0.17.0 引入) QImage | drawDebugBackground(qint32 width, qint32 height) |
(自 Visindigo 0.17.0 引入) QImage | globalRimImage(const QImage &image, int borderRadius, const QPointF &lightDirection, int lightThickness, const QColor &lightColor, int shadowThickness, const QColor &shadowColor) |
(自 Visindigo 0.17.0 引入) QImage | rimLightImage(const QImage &image, int borderRadius, const QPoint &mousePosition, int thickness, int range, const QColor &color, qreal intensity = 1.0, QRect *changedRect = nullptr) |
详细说明
LiquidGlassEffect 是一个 QGraphicsEffect 的子类,提供了一种模仿IOS26的液态玻璃的图形效果。 这个实现认为液态玻璃效果主要由四部分组成:模仿液体流动的扭曲效果、模仿玻璃模糊的高斯模糊、反应鼠标位置的边缘光和模仿真实光源的全局打光。 用户可以通过设置不同的属性来调整这些效果的强度和外观。
此外,这个实现也仅适用于矩形、圆角矩形和圆形的QWidget,异形的QWidget可能无法正确显示效果,暂不考虑支持异形QWidget。
Note: 注意,要正确使用这个类,它的父对象必须是将被应用效果的QWidget,否则效果可能无法正确显示。
值得指出的是,此类的核心功能:扭曲、模糊和边缘光(鼠标/全局) 也可通过静态函数直接调用,允许用户在不使用QGraphicsEffect的情况下对任意图像应用这些效果; 另外还有drawDebugBackground(),用来生成一张适合调试和演示这些效果的背景图。
被模糊源的取得
由于QWidget::render()方法的限制,很多时候其渲染的内容可能丢失下层窗口的内容,因此这个实现提供了两种获取被模糊源的方法:
- 1. LiquidGlassEffect::BackgroundPolicy::Render:把控件所在的父控件渲染一遍来取被模糊源。这种方法在大多数情况下效果不错,但在某些特定情况下可能会丢失下层窗口的内容。 尤其在下层窗口本身就含有透明要素时,这种方法可能会导致模糊效果不正确。 此外,Qt渲染子控件时会照常应用它们的QGraphicsEffect,所以压在玻璃下面的玻璃是能透出来的,模糊、色散都能叠上去。 能否透出来取决于下层自己能不能完成绘制:BackgroundPolicy::CustomImage的下层玻璃不需要再渲染父控件,可以正常参与合成; 而BackgroundPolicy::Render的下层玻璃在被上层采样时,会在“渲染父控件的中途又去渲染父控件”, 那次采样拿不到东西,于是采样里只剩它未经效果的原始内容,也就是看得见字和图形、看不见它自己的模糊。
- 2. LiquidGlassEffect::BackgroundPolicy::CustomImage:允许用户直接设置一个自定义的图像作为被模糊源。这种方法可以确保模糊效果的正确性,但需要用户自己提供一个合适的图像。 一般来说,如果用户的窗体含有透明要素并存在多级层叠,这是唯一可能可以正确显示模糊效果的方法。
CustomImage 模式下的PositionPolicy
当BackgroundPolicy设置为CustomImage时,PositionPolicy的设置会影响模糊效果的位置,即模糊效果会根据PositionPolicy的设置在CustomImage上进行定位和裁剪:
- 1. PositionPolicy::ParentLocalGeometry:模糊效果的位置和大小与父对象的本地几何形状相匹配。这意味着CustomImage可以被视为是父对象所在区域的背景。
- 2. PositionPolicy::ParentGlobalGeometry:模糊效果的位置和大小与父对象在屏幕上的全局几何形状相匹配。这意味着CustomImage可以被视为是整个窗口的背景。
- 3. PositionPolicy::CustomGeometry:模糊效果的位置和大小由用户通过setCustomGeometry()方法设置的自定义几何形状决定。这提供了最大的灵活性,允许用户完全控制模糊效果在CustomImage上的位置和大小。
指的指出的是,CustomGeometry应该至少和控件保持一致的长宽比例,否则可能会导致模糊效果的变形。
效果类型
默认情况下,LiquidGlassEffect会同时应用色散扭曲、模糊、边缘光和全局打光四种效果,但用户也可以通过setEffectTypes()方法选择只应用其中一部分效果。这提供了更多的定制选项,允许用户根据自己的需求调整效果的外观。 当扭曲和模糊同时应用时,扭曲效果会先应用于被模糊源的图像,然后模糊效果会应用于已经被扭曲的图像。这种顺序可以确保模糊效果能够正确地模仿液态玻璃的外观。 边缘光比较特殊,它不是一直存在的效果,只在鼠标靠近控件时才会出现;而全局打光是一直存在的,它的光来自一个固定的方向,不需要鼠标参与。
扭曲与色散
扭曲模仿的是玻璃边缘对光的折射:函数在图像的边缘区域做基于正弦的坐标偏移,图像中心保持不变, 半径越大,边缘区域的宽度越大,扭曲越明显。扭曲有两种:
- EffectType::NormalDistort:三个颜色通道用同一套映射,就是普通的扭曲效果。
- EffectType::DispersionDistort:给三个通道不同的映射距离(绿光不动,红光偏折得少一点、蓝光多一点),也是默认的扭曲。 于是边缘会出现彩色镶边,模仿真实玻璃的色散。它需要为每个像素多采样两个通道,因此性能会略差,对于不追求极致效果的场景可以改用普通扭曲
色散强度通过setLiquidDistortDispersion()调整,取值 0 到 0.5,为 0 时退化成普通扭曲。
边缘光
边缘光模仿的是玻璃边缘被光打亮的样子,它通过EffectType::RimLight开启(包含在EffectType::All中)。 与其他两种效果不同,边缘光只在鼠标靠近控件的时候才会出现,而且总是出现在离鼠标最近的那一段控件边界上: 鼠标沿着边界移动时,边缘光会跟着在边界上滑动,看上去就像是控件边缘在反射鼠标位置的光。
边缘光的颜色、厚度、沿边界延伸的距离以及激活距离分别通过setRimLightColor()、setRimLightThickness()、setRimLightRange()和setRimLightActivationDistance()调整。 其中激活距离决定了鼠标离控件边界多远时边缘光开始出现,超过这个距离时边缘光完全消失,控件也不会因此而被重绘。 与全局打光的操作一样,边缘光也是按乘法调制把画面提亮(而不是叠一层白),所以不会把玻璃的颜色洗淡。
全局打光
全局打光模仿的是真实世界里的光源:控件不再是均匀发亮的,而是有一个固定的来光方向, 迎光的那一面被照亮、与光垂直的两侧完全没有光、背光的那一面则压出一条暗边作为阴影, 这样控件看上去就有了“厚度”和“被光照到”的体积感。它通过EffectType::GlobalRim开启(包含在EffectType::All中)。
光的方向通过setGlobalRimLightDirection()设置,取值是一个从控件指向光源的向量(不需要是单位向量, 以屏幕坐标为准、y轴向下),默认QPointF(-0.5, -0.866),也就是从左上角来、与竖直方向成30度的光: 上边界最亮,左边界次之,右边界是浅阴影,下边界是深阴影,四个圆角处自然地从明过渡到暗。 亮面的颜色和厚度分别通过setGlobalRimLightColor()和setGlobalRimLightThickness()设置, 阴影的颜色和厚度分别通过setGlobalRimShadowColor()和setGlobalRimShadowThickness()设置。 两者的默认强度刻意压得比较淡(亮面alpha值90、阴影alpha值60):全局光只是一个效果元素, 做满了会盖过玻璃本身的颜色,喧宾夺主。 阴影与亮面一样是按乘法调制压暗画面的(见上一节),所以它是“吸掉一部分光”而不是直接盖一层黑: 纯黑阴影按比例压暗三个通道,彩色阴影只会吸掉它的补色。
性能考虑
由于模糊和扭曲效果都可能比较耗费性能,尤其是在较大的半径设置下,因此建议用户在使用这个类时注意性能问题。特别是在需要频繁更新效果的情况下,过大的半径设置可能会导致界面卡顿。
从实现代码的角度来看,模糊的性能永远且一定差于扭曲,因此用户在设置模糊半径时应该谨慎考虑是否应该使用过大的模糊半径,以避免性能问题。
边缘光本身的开销很小(它只处理边界附近的像素,且只需要处理离鼠标较近的那一段边界), 但它在鼠标移动时会被持续重绘。为此实现在内部缓存了“扭曲+全局光之后”的图像及其模糊结果: 鼠标移动时只有边缘光那一小块会被重新模糊(分块卷积的结果与整张卷积逐像素相同,不会留下接缝), 因此每帧的开销只与边缘光的范围有关,与控件面积无关。 代价是每个实例会多占三张同尺寸图像的内存(扭曲结果、模糊结果、分块卷积的临时缓冲)。
BackgroundPolicy::Render的被模糊源是现渲染出来的,本来随时可能变,但它同样能利用上面这个缓存。 启用这种策略时,这个类会监听采样矩形内所有控件的重绘,有人重绘就把缓存作废,没人重绘就一直用缓存。 于是鼠标在玻璃上移动时,“取一次被模糊源”和“整张模糊”这两件最贵的事都不会发生。 反过来说,采样矩形内的控件如果一直在动(比如里面有个循环动画),缓存就会一直失效,此时开销和没有缓存时一样。 因此总的来说,虽然已经使用各种缓存机制,但Render策略还是相对只适合内容静止的场景; 像拖动这种内容一直在变的场景,用BackgroundPolicy::CustomImage便宜得多(只做一次图像裁剪)。
全局打光的图像会被缓存,只在控件尺寸、圆角或打光参数变化时重算,因此它不会带来持续的开销。
此类的模糊采用的是X-Y分解和整形计算的高斯模糊,虽然性能相较于直接卷积的高斯模糊有了很大的提升,但仍然是相当重的操作。
成员类型文档
[since Visindigo 0.13.0] enum class LiquidGlassEffect::BackgroundPolicy
定义了获取被模糊源的方法.
| Constant | Value | Description |
|---|---|---|
Visindigo::Widgets::LiquidGlassEffect::BackgroundPolicy::Render | 0 | 指示此类直接从QWidget::render()获取被模糊源 |
Visindigo::Widgets::LiquidGlassEffect::BackgroundPolicy::CustomImage | 1 | 指示此类使用用户提供的自定义图像作为被模糊源 |
这个enum 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] enum class LiquidGlassEffect::EffectType
flags LiquidGlassEffect::EffectTypes
定义了液态玻璃效果的类型.
| Constant | Value | Description |
|---|---|---|
Visindigo::Widgets::LiquidGlassEffect::EffectType::NormalDistort | 0x01 | 普通扭曲效果,模仿液体流动的效果,红绿蓝三个通道用同一套映射。 |
Visindigo::Widgets::LiquidGlassEffect::EffectType::Blur | 0x02 | 模糊效果,模仿玻璃模糊的效果。 |
Visindigo::Widgets::LiquidGlassEffect::EffectType::RimLight | 0x04 | 边缘光效果,在鼠标靠近控件时于控件边界上绘制跟随鼠标的边缘光。 |
Visindigo::Widgets::LiquidGlassEffect::EffectType::GlobalRim | 0x08 | 全局打光效果,按固定方向的虚拟光源在控件边界上打出亮面和阴影。 |
Visindigo::Widgets::LiquidGlassEffect::EffectType::DispersionDistort | 0x10 | 色散扭曲效果,在扭曲的同时让三个通道的映射距离不同,边缘会出现彩色镶边;与NormalDistort同时开启时以色散为准。 |
Visindigo::Widgets::LiquidGlassEffect::EffectType::All | NormalDistort | Blur | RimLight | GlobalRim | DispersionDistort | 同时应用普通扭曲、色散扭曲、模糊、边缘光和全局打光效果,扭曲永远优先于模糊,也是默认值。 |
这个enum 从 Visindigo 0.13.0 开始支持。
EffectTypes 类型是 QFlags<EffectType> 的一个类型别名。它存储了多个 EffectType 值的OR组合,可供安全计算。
[since Visindigo 0.13.0] enum class LiquidGlassEffect::PositionPolicy
定义了模糊效果在CustomImage上的定位和裁剪方式.
| Constant | Value | Description |
|---|---|---|
Visindigo::Widgets::LiquidGlassEffect::PositionPolicy::ParentLocalGeometry | 0 | 模糊效果的位置和大小与父对象的本地几何形状相匹配 |
Visindigo::Widgets::LiquidGlassEffect::PositionPolicy::ParentGlobalGeometry | 1 | 模糊效果的位置和大小与父对象在屏幕上的全局几何形状相匹配 |
Visindigo::Widgets::LiquidGlassEffect::PositionPolicy::CustomGeometry | 2 | 模糊效果的位置和大小由用户通过setCustomGeometry()方法设置的自定义几何形状决定 |
这个enum 从 Visindigo 0.13.0 开始支持。
成员函数文档
[explicit, since Visindigo 0.13.0] LiquidGlassEffect::LiquidGlassEffect(QWidget *parent = nullptr)
parent 父窗口,且必须为将被应用效果的QWidget,否则效果可能无法正确显示。 构造函数。
这个function 从 Visindigo 0.13.0 开始支持。
[noexcept, since Visindigo 0.13.0] LiquidGlassEffect::~LiquidGlassEffect()
析构函数。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.13.0] QImage LiquidGlassEffect::blurImage(const QImage &image, int radius)
对图像进行高斯模糊处理。 image 要模糊的图像。 radius 模糊效果的半径,值越大模糊效果越明显。
此函数不提供sigma的手动设置,其sigma采用
sigma = 0.3 * ((radius - 1) * 0.5 - 1) + 0.8
来计算,这个公式是OpenCV使用的经验公式,可以在不同半径下得到比较自然的模糊效果。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.15.0] QImage LiquidGlassEffect::colorMaskImage(const QImage &image, const QColor &color, qreal percent)
对图像进行颜色遮罩处理。 image 要处理的图像。color 遮罩的颜色,决定了模糊效果的色调。percent 遮罩的透明度,值越大遮罩越透明,默认1。
这个function 从 Visindigo 0.15.0 开始支持。
[static, since Visindigo 0.13.0] QImage LiquidGlassEffect::distortImage(const QImage &coverdArea, int liquidDistortRadius, qreal dispersion = 0.0)
对图像进行液体扭曲处理。 coverdArea 要扭曲的图像。 liquidDistortRadius 扭曲效果的半径,值越大扭曲效果越明显。 此函数通过对图像的边缘区域进行基于正弦函数的坐标偏移来实现液体流动的效果。 扭曲半径决定了边缘区域的宽度,半径越大,扭曲效果越明显。
为了保持性能,扭曲效果仅应用于图像的边缘区域,而图像的中心部分保持不变。 这种方法可以在不显著增加计算量的情况下提供明显的液体流动效果。
当扭曲半径超过图像最短边的一半时,内部会自动按最短边的一半进行扭曲,且不改变用户设置值。
dispersion 色散强度,取值 0 到 0.5,默认0(不做色散)。 色散通过给红绿蓝三个通道不同的映射距离实现:绿光不动,红光偏折得少一点、蓝光多一点,于是边缘会出现彩色镶边。 它需要为每个像素多采样两个通道,因此会让扭曲的开销明显上升(仍然远低于模糊);为0时三通道共用同一套映射,开销与普通扭曲一致。
由于液态玻璃通常需要模糊效果,本质上算是一种平滑处理,因此考虑到综合性能, 这个扭曲实现在采样的时候没有单独进行插值计算,因此单独使用时可能会出现锯齿状的边缘。
这个function 从 Visindigo 0.13.0 开始支持。
[override virtual, since Visindigo 0.13.0] void LiquidGlassEffect::draw(QPainter *painter)
重写了QGraphicsEffect的draw()方法,在其中实现了液态玻璃效果的绘制逻辑。 painter 用于绘制效果的QPainter对象。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.17.0] QImage LiquidGlassEffect::drawDebugBackground(qint32 width, qint32 height)
生成一张用于调试和演示液态玻璃效果的背景图。 width 图像的宽度,单位为像素。 height 图像的高度,单位为像素。
这个function 从 Visindigo 0.17.0 开始支持。
[override virtual, since Visindigo 0.17.0] bool LiquidGlassEffect::eventFilter(QObject *watched, QEvent *event)
watched 事件的目标对象。event 待处理的事件。
重写了QObject的eventFilter()方法,用于在启用边缘光时跟踪鼠标位置。
这个function 从 Visindigo 0.17.0 开始支持。
[static, since Visindigo 0.17.0] QImage LiquidGlassEffect::globalRimImage(const QImage &image, int borderRadius, const QPointF &lightDirection, int lightThickness, const QColor &lightColor, int shadowThickness, const QColor &shadowColor)
在图像上绘制全局打光,返回绘制后的图像。 image 要绘制的图像,尺寸应当与要打光的控件尺寸一致。 borderRadius 控件的圆角半径,光效沿着这个圆角矩形的边界生成。 lightDirection 从控件指向光源的方向向量,不需要是单位向量。 lightThickness 亮面从边界向内扩散的范围,单位为像素。 lightColor 亮面的颜色,其alpha值决定了亮面的最大强度。 shadowThickness 阴影从边界向内扩散的范围,单位为像素。 shadowColor 阴影的颜色,其alpha值决定了阴影的强度。
这个function 从 Visindigo 0.17.0 开始支持。
[static, since Visindigo 0.17.0] QImage LiquidGlassEffect::rimLightImage(const QImage &image, int borderRadius, const QPoint &mousePosition, int thickness, int range, const QColor &color, qreal intensity = 1.0, QRect *changedRect = nullptr)
在图像上绘制边缘光,返回绘制后的图像。 image 要绘制的图像,尺寸应当与要绘制边缘光的控件尺寸一致。 borderRadius 控件的圆角半径,边缘光贴着这个圆角矩形的边界生成。 mousePosition 鼠标位置,坐标系与 image 相同,允许取值在控件之外。 thickness 边缘光的厚度,即从边界向内扩散的范围,单位为像素。 range 边缘光沿边界延伸的距离,单位为像素。 color 边缘光的颜色,其alpha值决定了边缘光的最大强度。 intensity 整体强度,取值 0 到 1,默认1。鼠标靠近时的淡入、离开时的淡出就靠它。 changedRect 可选输出,返回本次实际改动的区域;不需要就传nullptr。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setBackgroundImage(const QImage &image)
设置被模糊源的图像,仅在BackgroundPolicy为CustomImage时有效。 image 用于模糊的图像。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setBackgroundPolicy(Visindigo::Widgets::LiquidGlassEffect::BackgroundPolicy policy)
设置获取被模糊源的方法。 policy 获取被模糊源的方法,决定了模糊效果的来源。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setBlurRadius(int radius)
设置模糊效果的半径,单位为像素。 radius 模糊效果的半径,值越大模糊效果越明显。 出于性能考虑,建议不要设置过大的模糊半径,尤其是在较大的控件上。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setBorderRadius(int radius)
设置边框半径,单位为像素。 radius 边框的半径,值越大边框越圆润。 如果被应用效果的控件具有圆角,那么就应该同步设置此值以避免输出时溢出应有的视觉边界。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.15.0] void LiquidGlassEffect::setColorMask(const QColor &color, qreal percent)
设置颜色遮罩。 color 遮罩的颜色,决定了模糊效果的色调。 percent 遮罩的透明度,值越大遮罩越透明,默认1。 颜色遮罩会在模糊效果之后应用,可以用来调整模糊效果的整体色调和透明度,从而更好地模仿液态玻璃的外观。
这个function 从 Visindigo 0.15.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setCustomGeometry(const QRect &geometry)
设置自定义几何形状,仅在PositionPolicy为CustomGeometry时有效。 geometry 自定义的几何形状,决定了模糊效果在CustomImage上的位置和大小。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setEffectTypes(Visindigo::Widgets::LiquidGlassEffect::EffectTypes effects)
设置效果类型 effects 要应用的效果类型,可以是EffectType的任意组合。 默认是EffectType::All,即普通扭曲、色散扭曲、模糊、边缘光和全局打光全开; 只想用其中几种时,用|把需要的EffectType拼起来传给这个函数即可。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setGlobalRimLightColor(const QColor &color)
设置全局打光亮面的颜色,仅在EffectType中包含GlobalRim时有效。 color 迎光面的颜色,其alpha值决定了亮面的最大强度,默认白色、alpha值90(刻意做得比较淡)。 全局光只是一个效果元素,默认不应该盖过玻璃本身的颜色,需要更强的光时把alpha值调大即可。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setGlobalRimLightDirection(const QPointF &direction)
设置全局打光的光源方向,仅在EffectType中包含GlobalRim时有效。 direction 从控件指向光源的方向向量,不需要是单位向量,默认QPointF(-0.5, -0.866),即光从左上角来、与竖直方向成30度。 以屏幕坐标为准(y轴向下),因此(-0.5, -0.866)表示光从左上角来(偏上),(0, -1)表示光从正上方来,(-1, 0)表示光从左侧来,(1, 1)表示光从右下角来。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setGlobalRimLightThickness(int thickness)
设置全局打光亮面的厚度,仅在EffectType中包含GlobalRim时有效。 thickness 亮面从控件边界向内扩散的范围,单位为像素,默认1。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setGlobalRimShadowColor(const QColor &color)
设置全局打光的阴影颜色,仅在EffectType中包含GlobalRim时有效。 color 背光面阴影的颜色,其alpha值决定了阴影的强度,默认半透明黑色(alpha值60)。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setGlobalRimShadowThickness(int thickness)
设置全局打光的阴影厚度,仅在EffectType中包含GlobalRim时有效。 thickness 阴影从控件边界向内扩散的范围,单位为像素,默认2。 阴影一般比亮面厚一些,这样控件看上去才像是一块有厚度的玻璃。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setLiquidDistortDispersion(qreal dispersion)
设置扭曲的色散强度,仅在EffectType中包含DispersionDistort时有效。 dispersion 色散强度,取值会被夹到 0 到 0.5 之间,默认0.2。 色散就是让红绿蓝三个通道的映射距离略有不同(绿光不动,红光偏折得少一点、蓝光多一点), 于是边缘会出现彩色镶边,看起来就像真实玻璃把光拆开了;0表示三个通道完全一致(等同于NormalDistort),越大彩色镶边越明显。 色散需要为每个像素多采样两个通道,因此会略微增加扭曲的开销。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setLiquidDistortRadius(int radius)
设置液体扭曲效果的半径,单位为像素。 radius 扭曲效果的半径,值越大扭曲效果越明显。 当扭曲半径超过控件最短边的一半时,内部会自动按最短边的一半进行扭曲,且不改变用户设置值。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void LiquidGlassEffect::setPositionPolicy(Visindigo::Widgets::LiquidGlassEffect::PositionPolicy policy)
设置模糊效果的位置策略,仅在BackgroundPolicy为CustomImage时有效。 policy 模糊效果的位置策略,决定了模糊效果在CustomImage上的定位和裁剪方式。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setRimLightActivationDistance(int distance)
设置边缘光的激活距离,仅在EffectType中包含RimLight时有效。 distance 鼠标离控件边界多远之内才会出现边缘光,单位为像素,默认40。 设置为0表示只在鼠标位于控件内部时才出现边缘光。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setRimLightColor(const QColor &color)
设置边缘光的颜色,仅在EffectType中包含RimLight时有效。 color 边缘光的颜色,其alpha值决定了边缘光的最大强度,默认半透明白色(alpha值130)。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setRimLightRange(int range)
设置边缘光沿控件边界延伸的距离,仅在EffectType中包含RimLight时有效。 range 边缘光在边界上能够延伸的距离,单位为像素,默认80。 边缘光总是出现在离鼠标最近的那一段边界上,并沿着边界向两侧衰减,这个值决定了它能够延伸多远。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void LiquidGlassEffect::setRimLightThickness(int thickness)
设置边缘光的厚度,仅在EffectType中包含RimLight时有效。 thickness 边缘光从控件边界向内扩散的范围,单位为像素,默认1。
这个function 从 Visindigo 0.17.0 开始支持。