首页 > 其他分享 >Qml 中实现毛玻璃效果

Qml 中实现毛玻璃效果

时间:2024-12-31 18:19:46浏览次数:5  
标签:效果 parent 模糊 value Qml 毛玻璃 anchors

【写在前面】

毛玻璃效果(Acrylic Effect)是一种常见的 UI 设计风格,它通过模糊背景并添加透明度和噪声效果,使界面元素看起来像是半透明的磨砂玻璃。

本文将介绍如何使用 Qml 实现这种效果,并提供一个完整的示例代码。


【正文开始】

1. 效果图

image

2. 毛玻璃效果的实现原理

毛玻璃效果的核心是通过模糊背景图像,并叠加透明度和噪声效果来实现。

具体来说,实现毛玻璃效果的步骤如下:

  1. 捕获背景图像:首先需要捕获背景图像,作为模糊效果的输入。
  2. 模糊处理:对捕获的背景图像进行模糊处理,生成模糊效果。
  3. 添加亮度和色调:通过叠加一个半透明的矩形,调整模糊区域的亮度和色调。
  4. 添加噪声效果:在模糊区域上叠加噪声图像,增加磨砂玻璃的质感。

3. 实现毛玻璃效果

DelAcrylic.qml 文件定义了一个自定义的 Qml 组件,用于实现毛玻璃效果。以下是该文件的主要部分:

  • ShaderEffectSource: 用于捕获源项(sourceItem)的内容,并将其作为模糊效果的输入。sourceRect 属性定义了捕获的区域。
ShaderEffectSource {
    id: __source
    anchors.fill: parent
    visible: false
    sourceRect: Qt.rect(control.x, control.y, control.width, control.height)
}
  • FastBlur: 对 ShaderEffectSource 的内容进行模糊处理。radius 属性控制模糊的强度。
FastBlur {
    id: __fastBlur
    anchors.fill: parent
    source: __source
    radius: 32
}
  • Rectangle: 有两个矩形,第一个矩形用于设置背景的亮度(luminosity),第二个矩形用于设置颜色的色调(colorTint)和透明度(opacityTint)。
Rectangle {
    anchors.fill: parent
    color: Qt.rgba(1, 1, 1, luminosity)
    radius: control.radiusBg
}

Rectangle {
    anchors.fill: parent
    color: Qt.rgba(colorTint.r, colorTint.g, colorTint.b, opacityTint)
    radius: control.radiusBg
}
  • Image: 用于添加噪声效果,噪声图像通过 base64 编码嵌入到 Qml 文件中。opacity 属性控制噪声的透明度。
Image {
    id: __noiseImage
    anchors.fill: parent
    source: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAGHaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj48dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz4slJgLAAAMNElEQVRYR02XW1NTd9vGf0nYZEFMVha7JBAIYYihEQVSUQQVtOrUtipVsTPtTOs38KDtUQ+Y6ZfoTI88aT3o2Jk6bUfa4QFEKZWIsgm7ECKQHZu1FpiQQAx5DnyfzHv6n//Jvbl+13Vrvv/++5zRaOSPP/7giy++wGQyMTw8TCgUoquri2QySSgUorm5mcbGRh4/fozT6cTtdvPgwQMMBgPnzp0DYHR0FEmSiEag=="
    fillMode: Image.Tile
    opacity: 0.02
}

4. 如何使用

main.qml 是示例文件,使用 DelAcrylic 组件并提供了交互式的滑块来控制模糊效果的参数。

以下是该文件的主要部分:

  • Window: 定义了一个窗口,宽度为 750,高度为 500,标题为 "Acrylic Test"。
Window {
    width: 750
    height: 500
    visible: true
    title: qsTr("Acrylic Test")
}
  • Image: 作为背景图像,填充整个窗口。
Image {
    id: bg
    anchors.fill: parent
    source: "qrc:/img.jpg"
}
  • DelAcrylic: 使用 DelAcrylic 组件,将其放置在窗口的中心位置,并绑定背景图像作为模糊效果的源项。opacityNoiseopacityTintradiusBlur 属性分别绑定到三个滑块的值。
DelAcrylic {
    id: acrylic
    x: (bg.width - width) * 0.5
    y: (bg.height - height) * 0.5
    width: 300
    height: 300
    sourceItem: bg
    opacityNoise: slider1.value
    opacityTint: slider2.value
    radiusBlur: slider3.value

    MouseArea {
        anchors.fill: parent
        drag.target: parent
    }
}
  • Column: 包含三个滑块,分别用于控制 opacityNoiseopacityTintradiusBlur 属性。
Column {
    Slider {
        id: slider1
        anchors.horizontalCenter: parent.horizontalCenter
        from: 0
        to: 1
        stepSize: 0.01
        value: 0.02
        ToolTip.visible: hovered
        ToolTip.text: value.toFixed(2)

        Text {
            anchors.left: parent.right
            anchors.leftMargin: 10
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("opacityNoise")
        }
    }

    Slider {
        id: slider2
        anchors.horizontalCenter: parent.horizontalCenter
        from: 0
        to: 1
        stepSize: 0.01
        value: 0
        ToolTip.visible: hovered
        ToolTip.text: value.toFixed(2)

        Text {
            anchors.left: parent.right
            anchors.leftMargin: 10
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("opacityTint")
        }
    }

    Slider {
        id: slider3
        from: 0
        to: 100
        value: 48
        ToolTip.visible: hovered
        ToolTip.text: value.toFixed(0)

        Text {
            anchors.left: parent.right
            anchors.leftMargin: 10
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("radiusBlur")
        }
    }
}

【结语】

通过 DelAcrylic.qmlmain.qml 文件,我们实现了一个具有毛玻璃效果的 Qml 应用程序。DelAcrylic 组件通过模糊背景图像、添加亮度和色调、以及叠加噪声效果,实现了毛玻璃效果。

这种毛玻璃效果可以广泛应用于现代 UI 设计中,特别是在需要模糊背景或实现类似 Acrylic 效果的场景中。通过调整模糊强度、透明度和噪声效果,我们可以创建出丰富多样的视觉效果,提升用户体验。

改进建议:

  • 性能优化:模糊效果可能会对性能产生影响,特别是在高分辨率或复杂场景下。可以考虑优化模糊算法或降低模糊的强度以提高性能。

  • 更多参数控制:可以添加更多的参数控制,例如噪声的类型、模糊的方向等,以提供更丰富的视觉效果。

最后:项目链接(多多star呀..⭐_⭐):

Github: https://github.com/mengps/QmlControls

Gitee: https://gitee.com/MenPenS/QmlControls

标签:效果,parent,模糊,value,Qml,毛玻璃,anchors
From: https://www.cnblogs.com/mengps/p/18644624

相关文章

  • 使用stable diffusion进行电商产品变换背景,一秒出大片效果!
    连接更自然关于AI绘画技术储备学好AI绘画不论是就业还是做副业赚钱都不错,但要学会AI绘画还是要有一个学习规划。最后大家分享一份全套的AI绘画学习资料,给那些想学习AI绘画的小伙伴们一点帮助!对于0基础小白入门:如果你是零基础小白,想快速入门AI绘画是可以考......
  • 关于 qt qml 报错 QtQuick.Controls 2 没有被注册
    qml报错无法加载QtQuick.Controls背景一个简单的qtcreaterdemo,qml文件如下importQtQuick2.15importQtQuick.Window2.15Window{visible:truewidth:640height:480title:qsTr("HelloWorld")//创建一个红色的矩形Rectangle{......
  • 支F宝碰一下支付推广做法全解析!为什么部署系统的效果更好?
    当前,支F宝碰一下支付设备的铺设率和使用率正在与日俱增,连带着支F宝碰一下支付推广项目所蕴藏的广阔市场前景和巨大收益潜力也随之不断显现,不少创业者也因此打听起了支F宝碰一下支付推广怎么做的相关事宜。而事实上,支F宝碰一下支付推广项目的做法主要有两种,一种是daili模式,一......
  • [Stable Diffusion]ip-adapter:SD也可以垫图了,一张图复刻lora效果
    前言:在人工智能绘画的领域中,StableDiffusion一直是创作者们的得力工具。如今,随着ip-adapter的出现,SD迎来了新的突破——可以像传统绘图软件一样垫图了。这一创新功能不仅为创作者提供了更多的创意可能性,更能以一张图复刻lora效果,极大地提升了绘画的效率和质量,让我们......
  • CSS特效032:2025庆新春,孔明灯向上旋转飘移效果
    CSS常用示例100+专栏目录本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS相关的库、知识点、理论篇章等。因为常用所以记录、展示、......
  • 使用meter标签制作一个密码强度效果
    在HTML5中,<meter>标签用于表示一个范围内的数值。这可以用于展示密码强度,其中数值可以代表密码的复杂性或安全性。下面是一个简单的示例,展示了如何使用<meter>标签来制作一个密码强度效果:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname=......
  • 快手私信自动回复跳转卡片,实现轻松达到引流微信的效果
    快手私信卡片是快手平台内一种特殊的分享和交互方式。卡片的内容可以自定义,因此更能吸引用户的点击。快手私信卡片的主要功能包括:跳转微信:用户点击卡片后,系统会自动打开微信并显示指定的二维码,用户长按识别即可添加好友或进入群聊。不要急,我们先来看演示视频了解一下,视频教......
  • 抖音私信跳转卡片,实现轻松达到引流微信的效果
    抖音私信卡片是抖音平台内一种特殊的分享和交互方式。卡片的内容可以自定义,因此更能吸引用户的点击。抖音私信卡片的主要功能包括:跳转微信:用户点击卡片后,系统会自动打开微信并显示指定的二维码,用户长按识别即可添加好友或进入群聊。不要急,我们先来看演示视频了解一下,视频教......
  • 记录---前端实现签字效果+合同展示
    ......
  • Unity URP实现漫画板效果
    参考:UE用Masked做视差漫画板(新手向)可以分成两个部分,一块是画框,一块是绘制框内的内容(以下实现都默认所有顶点在同一平面上)。画框创建透明unlit材质,计算边框区域并且着色。创建一个脚本(CreateMesh.cs下称CreateMesh)用于创建和控制四边形网格,CreateMesh可以控制的参数有四个顶......