异形遮罩之QML中的 `OpacityMask` 实战

news2025/4/15 22:38:22

文章目录

  • 🌧️ 传统实现的问题
    • 👉 效果图
  • 🌈 使用 OpacityMask 的理想方案
    • 👉代码如下
    • 🎯 最终效果:
  • ✨ 延伸应用
  • 🧠 总结

在 UI 设计中,经常希望实现一些“异形区域”拥有统一透明度或颜色的效果,比如多个图形重叠形成一个复杂形状,同时其背景色看起来是统一透明的。

但如果你直接将多个带透明度的图形叠加使用,就会出现一个问题:重叠区域颜色会叠加变深,显得非常不自然。

本文将结合一个具体的 QML 案例,演示如何使用 OpacityMask 遮罩技术,让多个图形在视觉上拥有“统一背景透明度”的效果,告别颜色叠加阴影!


🌧️ 传统实现的问题

先来看一个常见的场景:

我们想绘制两个矩形 + 一个圆形,颜色统一为半透明黑(#88000000)。使用最直观的方式叠加:

import QtQuick 2.15
import QtGraphicalEffects   1.15
import QtQuick.Window 2.12

Window {
    visible: true
    width: 400
    height: 300
    title: qsTr("OpacityMask")

    Image {
        anchors.fill: parent
        source: "qrc:/image.png"
        fillMode: Image.PreserveAspectCrop
        mipmap : true
        smooth : true
    }

    Rectangle {
        anchors.horizontalCenter: parent.horizontalCenter
        y:          25
        width:      250
        height:     150
        color:      "transparent"
       //1正常两个矩形叠加,叠加区域能看到阴影
       Rectangle {
           id:     rect1
           y:      25
           width:  100
           height: 100
           color:  "#88000000"
       }
       Rectangle {
           id:     rect2
           x:      50
           width:  150
           height: 150
           color:  "#88000000"
           radius: width/2
       }
       Rectangle {
           x:      150
           y:      25
           width:  100
           height: 100
           color:  "#88000000"
       }

👉 效果图

中间区域变暗了! 这正是由于多个带透明度的图形叠加,alpha 通道和 RGB 都发生了混合,导致颜色发黑发沉。

在这里插入图片描述

🌈 使用 OpacityMask 的理想方案

为了实现真正“统一透明度”的视觉效果,核心做法是:

把所有的异形结构作为一个 遮罩层; 把颜色块作为一个 单一绘制源; 最后用 OpacityMask 把颜色源“裁剪”成异形结构。

这样,颜色只绘制一次,重叠区域也不会颜色叠加。

👉代码如下

Window {
    visible: true
    width: 400
    height: 300
    title: qsTr("OpacityMask")

    Image {
        anchors.fill: parent
        source: "qrc:/image.png"
        fillMode: Image.PreserveAspectCrop
        mipmap : true
        smooth : true
    }

    Rectangle {

        anchors.horizontalCenter: parent.horizontalCenter
        y:          25
        width:      250
        height:     150
        color:      "transparent"

        // 颜色源,只绘制一次的颜色块
        Rectangle {
            id:             colorSource
            anchors.fill:   parent
            color:          "#88000000"
            visible:        false // 不直接显示,只作为 source 提供颜色
        }

        // ⚪ 中间遮罩结构:两个矩形 + 一个圆,构造完整形状
        Item {
            id: maskShape
            width: parent.width
            height: parent.height
            Rectangle {
                id:     rect1
                y:      25
                width:  100
                height: 100
                color:  "WHITE"
                radius:  height/4
            }
            Rectangle {
                id:     rect2
                x:      50
                width:  150
                height: 150
                color:  "WHITE"
                radius: width/2
            }
            Rectangle {
                x:      150
                y:      25
                width:  100
                height: 100
                color:   "WHITE"
                radius:  height/4

            }
            visible: false // 遮罩不直接显示
        }

        // 🎭 使用 OpacityMask:统一颜色 + 遮罩形状 => 最终视觉一致
        OpacityMask {
            anchors.fill:   parent
            source:         colorSource
            maskSource:     maskShape
            invert:         false
        }
    }
}

🎯 最终效果:

整个异形区域颜色看起来完全一致;

不会因为区域重叠而变暗;

支持任意复杂遮罩图形:圆、星、路径等都可以;

真正达到“只绘制一次颜色”的目的。

在这里插入图片描述

✨ 延伸应用

复杂卡片 UI、气泡对话框、玻璃模糊区域;

某些需要 alpha 模板控制的游戏 HUD;

异形组件背景、视觉统一主题风格;

🧠 总结

使用 OpacityMask 是 QML 中处理异形遮罩 + 统一色彩透明度的推荐方式。它不仅能解决“颜色叠加变深”的视觉问题,还提供了很强的图形控制能力。

通过这种方式,你的界面设计会更干净、更专业,也更具“工业级”质感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何为您的设计应用选择高速连接器

电气应用的设计过程需要考虑诸多因素,尤其是在设计高速网络时。许多连接器用户可能没有意识到,除了在两个互连之间组装导电线路之外,还需要考虑各种工艺。在建立高速连接并确保适当的信号完整性时,必须考虑蚀刻、公差、屏蔽等因素…

【论文阅读】UniAD: Planning-oriented Autonomous Driving

一、Introduction 传统的无人驾驶采用了区分子模块的设计,即将无人驾驶拆分为感知规划控制三个模块,这虽然能够让无人驾驶以一个很清晰的结构实现,但是感知的结果在传达到规划部分的时候,会导致部分信息丢失,这势必会…

upload-labs二次打

1(前端js绕过) 弹窗,先看看有没有js有,禁用js 禁用后就可以上传php文件了,然后我们就去访问文件,成功 2(MIME绕过) 先上传一个php文件试试,不行,.htaccess不行, 试试MIME类型&am…

提权实战!

就是提升权限,当我们拿到一个shell权限较低,当满足MySQL提权的要求时,就可以进行这个提权。 MySQL数据库提权(Privilege Escalation)是指攻击者通过技术手段,从低权限的数据库用户提升到更高权限&#xff…

ChromeOS 135 版本更新

ChromeOS 135 版本更新 一、ChromeOS 135 更新内容 1. ChromeOS 电池寿命优化策略 为了延长 Chromebook 的使用寿命,ChromeOS 135 引入了一项全新的电池充电限制策略 —— DevicePowerBatteryChargingOptimization,可提供更多充电优化选项&#xff0c…

javaSE.Lambda表达式

如果一个接口中有且只有一个待实现的抽象方法,那么我们可以将匿名内部类简写为Lambda表达式。 简写规则 标准格式: (【参数类型 参数名称,】...) -> {代码语句, 包括返回值} 只有一行花括号{}可以省略。…

【随身wifi】青龙面板保姆级教程

0.操作前必看 本教程基于Debian系统,从Docker环境。面板安装,到最后拉取脚本的使用。 可以拉库跑狗东京豆,elm红包等等,也可以跑写自己写的脚本,自行探索 重要的号别搞,容易黑号,黑号自己负责…

Android 之美国关税问题导致 GitHub 403 无法正常访问,责任在谁?

这几天各国关税问题导致世界动荡不安,如今GitHub又无法正常访问,是不是Google到时候也无法正常使用了。

4月13日星期日早报简报微语报早读

4月13日星期日,农历三月十六,早报#微语早读。 1、北京处置倒伏树木843棵,已全部处置完毕; 2、山西大同“订婚强奸案”本月16日二审宣判,一审男方被判3年刑; 3、今年我国快递业务量已突破500亿件&#xf…

动态路由, RIP路由协议,RIPv1,RIPv2

动态路由 1、回顾 路由:从源主机到目标主机的过程 源主机发送数据给目标主机,源主机会查看自身的路由信息 如果目标主机是自己同网段,源主机查看的是直连路由 如果目标主机和自己不同网段,源主机查看的是静态路由、动态路由、默…

【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测

基于穿戴装备的身体活动监测 摘要 本研究基于加速度计采集的活动数据,旨在分析和统计100名志愿者在不同身体活动类别下的时长分布。通过对加速度数据的处理,活动被划分为睡眠、静态活动、低强度、中等强度和高强度五类,进而计算每个志愿者在…

212、【图论】字符串接龙(Python)

题目描述 题目链接:110. 字符串接龙 代码实现 import collectionsn int(input()) beginStr, endStr input().split() strList [input() for _ in range(n)]deque collections.deque() # 使用队列遍历结点 deque.append([beginStr, 1]) # 存储当前字符串和遍…

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 四、行军线效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGam…

设计模式 四、行为设计模式(2)

五、状态模式 1、概述 状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生时改变其行为,这种模式可以消除大量的条件语句,并将每个状态的行为封装到单独的类中。 状态模式的主要组成部分如下: 1)上…

FEA 仿真助力高速连接器设计中的信号完整性

各行各业高速信号软件和硬件的快速发展,带来了更高的频率和带宽。因此,对连接器组件的整体性能要求也更加严格。同时,器件和封装形式、互连以及系统内其他设备的小型化也带来了额外的设计挑战。所有这些都对信号传输完整性产生重大影响。 高速…

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标,qt设置,可以在只启动HMI的时候隐藏光标,退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…

LangGraph——Agent AI的持久化状态

LangGraph 内置了一个持久化层,通过检查点(checkpointer)机制实现。当你使用检查点器编译图时,它会在每个超级步骤(super-step)自动保存图状态的检查点。这些检查点被存储在一个线程(thread)中,可在图执行后随时访问。由于线程允许在执行后访…

【双指针】专题:LeetCode 1089题解——复写零

复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法:双指针算法 先根据“异地”操…

【C++初学】C++核心编程(一):内存管理和引用

前言 在C的世界里,面向对象编程(OOP)是核心中的核心。它不仅是一种编程范式,更是一种思考问题的方式。本文将带你从C的内存分区模型出发,深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的…