DBlurEffectWidget的使用
DBlurEffectWidget的使用
# DBlurEffectWidget 的作用
用于实现主窗口或控件背景的实时模糊效果。
# 主窗口模糊(DBlurEffectWidget::BehindWindowBlend)和控件模糊(DBlurEffectWidget::InWindowBlend 、DBlurEffectWidget::InWidgetBlend)
主窗口模糊:依赖于窗口管理器的实现,目前仅支持 deepin-wm 和 kwin,可以使用DWindowManagerHelper::hasBlurWindow
判断当前运行环境中的窗口管理器是否支持模糊特效,使用 DPlatformWindowHandle::setWindowBlurAreaByWM
设置主窗口背景的模糊区域。如果在一个主窗口内同时使用了多个 DBlurEffectWidget
控件,则在更新主窗口模糊区域时会自动将所有控件的区域合并到 QVector<WMBlurArea>
或者 QList<QPainterPath>
(如果有任意一个控件设置了 DBlurEffectWidget::radius
属性)中统一设置。
控件模糊:原理和 DClipEffectWidget 类似,在控件绘制时先使用 QPlatformBackingStore::toImage()获取主窗口上控件对应区域内已经绘制的内容,此时获取的内容为此控件下层控件所绘制的内容,将获得的 QImage 对象使用软件算法进行模糊处理,然后再将模糊之后的图像绘制到控件上。由于实现原理限制,不适用于主窗口为OpenGL绘制模式的窗口(如:QOpenGLWindow ),且控件下面使用OpenGL绘制的内容也生成模糊的效果(如 QOpenGLWidget )。
# DBlurEffectWidget 属性
DBlurEffectWidget::radius
模糊效果计算时的取样范围,模糊的原理为:将此像素点和周围像素点合成计算得到得到新的值,此属性表示像素点周围 radius 距离的所有像素点参与计算。【可读可写,只在模式为 DBlurEffectWidget::InWindowBlend
时有效】
DBlurEffectWidget::mode
所采用的模糊算法,默认值为 GaussianBlur。【可读可写,只在模式为 DBlurEffectWidget::InWindowBlend
时有效】
DBlurEffectWidget::blendMode
模糊的应用场景,默认会根据有没有父控件自动判断使用哪种模式。可读可写,只在模式为 DBlurEffectWidget::InWindowBlend
时有效】
DBlurEffectWidget::maskColor
画在控件模糊背景之上的颜色,此颜色的alpha通道值会被 maskAlpha 属性影响,修改此属性会自动将颜色模式设置为 CustomColor,设置后将不能再自动根据窗口管理器是否支持混成和模糊来自动使用最佳的颜色。
DBlurEffectWidget::maskAlpha
maskColor 的alpha通道值。当前窗口管理器支持混成(窗口背景透明)时默认值为102,否则为204。
DBlurEffectWidget::full
如果值为true,将模糊此控件所在顶层窗口的整个背景,而无论控件的大小和位置,否则使用控件的位置和大小。
DBlurEffectWidget::blurEnabled
如果值为 true 则此控件的模糊设置生效,否则不生效。
# 使用范例
DBlurEffectWidget *blurWidget = new DBlurEffectWidget(this);
blurWidget->setRadius(30);
blurWidget->setFixedSize(200, 200);
blurWidget->setBlurRectXRadius(100);
blurWidget->setBlurRectYRadius(100);
blurWidget->setMaskColor(DBlurEffectWidget::LightColor);
QPainterPath clipPath;
clipPath.addRect(0, 50, 200, 150);
blurWidget->setMaskPath(clipPath);