AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解
在 Launcher3 执行涉及其他应用窗口(即“远程窗口”)的动画时,例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画,SurfaceControl
扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。
SurfaceControl在源码中的使用
Launcher3中有几处非常经典的使用SurfaceControl的地方。
在分屏应用进入到最近任务,或者从最近任务启动应用时,涉及到分屏应用中间的bar条,这个bar条是属于SystemUI进程的,在Launcher中显示就属于远程窗口,因此需要通过SurfaceControl来进行更新操作。
启动分屏应用时bar条由隐藏到最终显示的过程就是通过SurfaceControl控制bar条的透明度来实现的。
源码如下:
public static ValueAnimator createSplitAuxiliarySurfacesAnimator(@Nullable RemoteAnimationTarget[] nonApps, boolean shown,@Nullable Consumer<ValueAnimator> animatorHandler) {if (nonApps == null || nonApps.length == 0) {return null;}List<SurfaceControl> auxiliarySurfaces = new ArrayList<>();for (RemoteAnimationTarget target : nonApps) {final SurfaceControl leash = target.leash;if (target.windowType == TYPE_DOCK_DIVIDER && leash != null && leash.isValid()) {auxiliarySurfaces.add(leash);}}if (auxiliarySurfaces.isEmpty()) {return null;}SurfaceControl.Transaction t = new SurfaceControl.Transaction();if (animatorHandler == null) {// Apply the visibility directly without fade animation.for (SurfaceControl leash : auxiliarySurfaces) {t.setVisibility(leash, shown);}t.apply();t.close();return null;}ValueAnimator dockFadeAnimator = ValueAnimator.ofFloat(0f, 1f);dockFadeAnimator.addUpdateListener(valueAnimator -> {float progress = valueAnimator.getAnimatedFraction();for (SurfaceControl leash : auxiliarySurfaces) {if (leash != null && leash.isValid()) {t.setAlpha(leash, shown ? progress : 1 - progress);}}t.apply();});dockFadeAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationStart(Animator animation) {if (shown) {for (SurfaceControl leash : auxiliarySurfaces) {t.setLayer(leash, Integer.MAX_VALUE);t.setAlpha(leash, 0);t.show(leash);}t.apply();}}@Overridepublic void onAnimationEnd(Animator animation) {if (!shown) {for (SurfaceControl leash : auxiliarySurfaces) {if (leash != null && leash.isValid()) {t.hide(leash);}}t.apply();}t.close();}});dockFadeAnimator.setDuration(SPLIT_DIVIDER_ANIM_DURATION);animatorHandler.accept(dockFadeAnimator);return dockFadeAnimator;}
下来来详解SurfaceControl在Launcher中的角色以及为什么要使用SurfaceControl
SurfaceControl
的角色:
- 窗口/图层的句柄: 在 Android 图形系统中,每个窗口或可视元素最终都对应一个或多个图层 (Layer),这些图层由系统的合成器 (
SurfaceFlinger
) 负责管理和混合。SurfaceControl
是一个轻量级的句柄 (Handle),它代表了SurfaceFlinger
中的一个图层(Surface)。你可以把它想象成一个指向屏幕上某个“画板”的遥控器。 - 直接操作图层属性: 通过
SurfaceControl
,一个有权限的进程(在远程动画场景下,通常是 Launcher 或 SystemUI)可以直接、高效地修改其代表的图层在SurfaceFlinger
中的各种属性,而无需与创建这个图层的原始应用进程进行复杂的通信或等待其响应。这些属性包括:- 几何变换: 位置 (Position)、缩放 (Scale)、旋转 (Rotation) (通常通过设置变换矩阵
Matrix
实现)。 - 视觉效果: 透明度 (Alpha)、层级 (Z-order)、裁剪区域 (Window Crop)、圆角半径 (Corner Radius)、阴影 (Shadow Radius)、模糊 (Blur) 等。
- 几何变换: 位置 (Position)、缩放 (Scale)、旋转 (Rotation) (通常通过设置变换矩阵
- 跨进程动画的桥梁: 在远程动画中,系统 (
WindowManager
) 会将参与动画的窗口(例如正在打开的应用窗口、正在关闭的 Launcher 窗口、壁纸窗口)的SurfaceControl
(通常是一个称为 “Leash” 的特殊控制层)打包在RemoteAnimationTarget
对象中,传递给动画控制器(Launcher)。 - 动画执行者 (
SurfaceControl.Transaction
): Launcher 拿到这些SurfaceControl
后,不会去修改对应应用的 View 属性,而是创建SurfaceControl.Transaction
对象。在动画的每一帧:- Launcher 计算出每个目标窗口图层应该具有的视觉属性(比如,应用窗口从图标大小放大到全屏,透明度从 0 到 1,裁剪区域从无到有,圆角从大变小)。
- 使用
Transaction
提供的方法(如setMatrix()
,setAlpha()
,setWindowCrop()
,setCornerRadius()
)为每个SurfaceControl
设置这些目标属性。 - 最后调用
transaction.apply()
原子性地将这一帧的所有属性变更提交给SurfaceFlinger
。 SurfaceFlinger
在下一个 VSYNC 信号到来时,根据这些最新的属性来合成并显示屏幕内容,从而驱动了视觉上的动画效果。
为什么在远程动画中使用 SurfaceControl
?
使用 SurfaceControl
是实现现代 Android 流畅、复杂过渡动画的关键,原因如下:
- 高性能 (Performance): 直接在
SurfaceFlinger
(系统合成器)层面操作图层属性非常高效,通常能利用硬件加速。这避免了在应用进程内部进行复杂的 View 布局、绘制或属性动画,这些操作可能更耗资源且容易引发卡顿 (Jank)。 - 精确同步 (Synchronization): 对于涉及多个应用窗口(跨进程)的过渡动画(如应用启动/关闭、分屏),需要精确地同步它们的动画。通过
SurfaceControl.Transaction
,Launcher 可以原子性地更新所有相关图层的属性,确保它们在同一帧内发生变化,实现完美的视觉同步。如果依赖各个应用自己执行动画,几乎不可能做到如此精确的同步。 - 强大控制力 (Control):
SurfaceControl
API 提供了对图层视觉属性的底层、细粒度控制,使得 Launcher 可以实现非常复杂的动画效果,例如从图标到窗口的平滑变形、窗口内容的裁剪、圆角变化等,这些效果很难通过传统的 View 动画或窗口动画(ActivityOptions
)实现得如此精细。 - 解耦 (Decoupling): 被动画的应用(例如正在启动的应用)不需要主动参与这个由 Launcher 控制的过渡动画。应用只需要正常地将自己的内容绘制到它的 Surface 上即可。Launcher 通过
SurfaceControl
在外部“指挥”SurfaceFlinger
如何变换和展示这个 Surface。这大大降低了应用和系统过渡动画之间的耦合度。 - 无缝体验 (Seamlessness):
SurfaceControl
使得元素(如图标)看起来能够“无缝地”跨越进程边界变形成为另一个应用的窗口,提供了非常连贯和自然的视觉体验。
总结:
在 Launcher 对远程窗口执行动画的过程中,SurfaceControl
充当了底层图层(Surface)的直接控制器。Launcher 通过它,绕开了应用进程,直接与系统合成器 SurfaceFlinger
交互,以高性能、精确同步的方式驱动应用窗口的几何变换和视觉效果,从而实现了流畅、复杂且跨进程的过渡动画。这是现代 Android 系统动画(尤其是 Quickstep 手势动画)的核心技术基础。
相关文章:
AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解
在 Launcher3 执行涉及其他应用窗口(即“远程窗口”)的动画时,例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画,SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …...
iframe下系统访问跨域问题解决办法
问题描述:iframe下嵌入web页面,访问后端接口跨域,导致接口调不通。 产生原因:iframe下,web端访问后端接口时,会优先向后端发送请求方法为OPTIONS的预检测请求,该请求调用不通,导致真…...
Kafka 如何理解Kafka的高可用
一、Kafka高可用核心思想:备胎的自我修养 核心口诀:“别把鸡蛋放在一个篮子里,除非你他妈有100个篮子!” Kafka的高可用设计,本质上就是一场**“分布式备胎大战”**。它的核心逻辑是: “老子不信任任何单…...
11-DevOps-Jenkins Pipeline流水线作业
前面已经完成了,通过在Jenkins中创建自由风格的工程,在界面上的配置,完成了发布、构建的过程。 这种方式的缺点就是如果要在另一台机器上进行同样的配置,需要一项一项去填写,不方便迁移,操作比较麻烦。 解…...
C++学习之游戏服务器开发十一DOCKER的基本使用
目录 1.多实例部署方案 2.容器的概念 3.docker初识 4.docker仓库 5.docker镜像 6.docker容器 7.docker和虚拟机的区别 8.docker命令解释 9.dockerfile构建镜像 10.离线分发镜像 1.多实例部署方案 redis 命令( redis-cli XXXX ) set key value:…...
docker学习笔记2-最佳实践
一、在容器中启动mysql的最佳实践 (一)查找目录 1、mysql的配置文件路径 /etc/mysql/conf.d 2、mysql的数据目录 /var/lib/mysql 3、环境变量 4、端口 mysql的默认端口3306。 (二)启动命令 docker run -d -p 3306:3306 …...
【TeamFlow】4.2 Yew库详细介绍
Yew 是一个用于构建高效、交互式前端 Web 应用程序的现代 Rust 框架,它借鉴了 React 和 Elm 等框架的设计理念,同时充分利用 Rust 的语言特性。 核心特性 基于组件的架构 Yew 采用组件化开发模式,类似于 React: 组件是可重用的 UI 构建块 …...
第六章.java集合与泛型
文章目录 1.集合框架1. Collection 接口存储一组不唯一,无序的对象2. Set接口存储一组唯一,无序的对象3. Map接口存储一组键值对象,提供key到value的映射 2.封装3.练习题 1.集合框架 java集合框架提供了一套性能优良,使用方便的接口和类,它们位于java.util中 1. Collection 接…...
elastic/go-elasticsearch与olivere/elastic
在 Go 语言中,与 Elasticsearch 交互的客户端库有多种选择,其中 github.com/elastic/go-elasticsearch/v8 和 github.com/olivere/elastic/v7 是两个常用的库。这两个库的功能和用途有一些差异,以下是它们的详细对比: 1. github.c…...
MYSQL之基础认识(卸载安装登录, 基本概念)
一. 卸载安装和登录 卸载 MYSQL 1. 查看有无mysql服务正在运行: ps ajx | grep mysql 2. 查看到 mysql 的服务名称: systemctl list-units --typeservice | grep mysql 3. 关闭 mysql 服务 4. 卸载 dpkg -l | grep mysql | awk {print $2} | xargs sudo apt remove --purg…...
Sentinel源码—7.参数限流和注解的实现一
大纲 1.参数限流的原理和源码 2.SentinelResource注解的使用和实现 1.参数限流的原理和源码 (1)参数限流规则ParamFlowRule的配置Demo (2)ParamFlowSlot根据参数限流规则验证请求 (1)参数限流规则ParamFlowRule的配置Demo 一.参数限流的应用场景 二.参数限流规则的属性 …...
JAVA:利用 Apache Tika 提取文件内容的技术指南
1、简述 Apache Tika 是一个强大的工具,用于从各种文件中提取内容和元数据。📄Tika 支持解析文档、📸图像、🎵音频、🎥视频文件以及其他多种格式,非常适合构建🔍搜索引擎、📂内容管理系统和📊数据分析工具。 样例代码:https://gitee.com/lhdxhl/springboot-…...
SVM(支持向量机)
SVM(支持向量机) 原理 SVM的核心目标是找到一个最大化分类间隔的超平面,将不同类别的样本分隔开。其原理可分为三部分: 线性可分情况 通过硬间隔最大化确定超平面,确保所有样本正确分类且间隔最大间隔定义为超平面到最…...
Spark,hadoop的组成
(一)Hadoop的组成 对普通用户来说, Hadoop就是一个东西,一个整体,它能给我们提供无限的磁盘用来保存文件,可以使用提供强大的计算能力。 在Hadoop3.X中,hadoop一共有三个组成部分&#…...
数据结构中的各种排序
排序之冒泡排序 原理:比较相邻的元素,将大的元素放右边,小的元素放左边。每一趟排的最后的元素一定是最大的元素,所有下一趟需要排列的元素可减少一个 public int[] bubbleSort(int[] attr) {for (int i 0; i < attr.length…...
Android 中实现 GIF 图片动画
在 Android 中,ImageView 从 Android 9.0(API 级别 28) 开始原生支持 GIF 动画,通过 AnimatedImageDrawable 类实现。在之前的版本中,ImageView 并不支持直接播放 GIF 动画,只能显示 GIF 的第一帧。 一、 …...
linux安装mysql数据库
1.判断系统是多少位的 file /sbin/init2.下载linux安装包 5.7.25.64位安装包链接:https://pan.baidu.com/s/13vFuRikwJaI96K0AmUQXzg提取码:ga7h其他版本安装 去官网下载:https://dev.mysql.com/downloads/mysql/3.创建mysql文件夹 mkdir /…...
基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线。输出指标包括最小平均流动时间,最大完工时间,最小间隙时间。 2…...
uniapp云打包针对谷歌视频图片权限的解决方案
谷歌在24年底推出把图片和视频细分为两个权限,uniapp使用uni.chooseImage云打包默认图片视频为一个权限,不符合谷歌要求会被下架 解决方法,在项目根目录下新建AndroidManifest.xml移除不必要的权限 <?xml version"1.0" encoding"utf…...
DSRAM介绍
DSRAM(双端口静态随机存储器)介绍 1. 基本概念 DSRAM(Dual-Port Static Random Access Memory)是一种双端口SRAM,支持两个独立的读写接口,允许两个设备(如CPU、DMA、FPGA)同时访问…...
【仿Mudou库one thread per loop式并发服务器实现】HTTP协议模块实现
HTTP协议模块实现 1. Util模块2. HttpRequest模块3. HttpResponse模块4. HttpContext模块5. HttpServer模块 1. Util模块 这个模块是一个工具模块,主要提供HTTP协议模块所用到的一些工具函数,比如url编解码,文件读写…等。 #include "s…...
教育行业网络安全:守护学校终端安全,筑牢教育行业网络安全防线!
教育行业面临的终端安全问题日益突出,主要源于教育信息化进程的加速、终端设备多样化以及网络环境的开放性。 以下是教育行业终端安全面临的主要挑战: 1、设备类型复杂化 问题:教育机构使用的终端设备包括PC、服务器等,操作系统…...
【网工第6版】第5章 网络互联②
目录 ■ IPV6 ▲ IPV6报文格式 ◎ IPV6扩展报头(RFC2460) ◎ IPv6相关协议 ▲ IPV6地址分类 ◎ IPv6地址基础 ◎ IPv6地址举例 ◎ IPv6地址分类 ◎ 特殊地址对比IPv4 vs IPv6 ▲ 过渡技术 本章重要程度:☆☆☆☆☆ ■ IPV6 与IPv4…...
ASP.NET Core 分层项目中EFCore的使用
文章目录 前言一、核心二、项目分层结构1)安装 NuGet 包Web 项目InfrastructureLibrary项目 2)领域模型和仓储接口 (Domain 层)3)基础设施层实现 (Infrastructure 层)4)应用层服务 (Application 层)5)Web API 配置6&am…...
.net core 中directory , directoryinfo ,file, fileinfo区别,联系,场景
一、类定义及核心功能 Directory类 类型:静态类 功能:提供目录操作的静态方法,包括创建、删除、移动目录,以及获取子目录或文件列表等。例如Directory.CreateDirectory()、Directory.GetFiles()。 适用场景&…...
jvm-获取方法签名的方法
在Java中,获取方法签名的方法可以通过以下几种方式实现,具体取决于你的需求和使用场景。以下是详细的介绍: 1. 使用反射 API Java 提供了 java.lang.reflect.Method 类来获取方法的相关信息,包括方法签名。 示例代码:…...
three.js中的instancedMesh类优化渲染多个同网格材质的模型
three.js小白的学习之路。 在上上一篇博客中,简单验证了一下three.js中的网格共享。写的时候就有一些想法,如果说某个场景中有一万棵树,这些树共享一个geometry和material,有没有好的办法将其进行一定程度上的渲染优化࿰…...
2025年一站式AI创作平台主要功能介绍及使用教程
在当今迅速发展的数字时代,人工智能(AI)已成为推动创新和提升工作效率的关键工具。今天给大家分享一个全面的一站式AIGC内容创作平台,对其主要功能及使用教程进行讲解,旨在帮助用户显著提升工作和学习效率。无论您需要…...
YOLO11改进,尺度动态损失函数Scale-based Dynamic Loss,减少标签不准确对损失函数稳定性的影响
在目标检测领域,标签噪声与尺度敏感问题始终是制约模型性能提升的"阿喀琉斯之踵"。2025年CVPR最佳论文提出的尺度动态损失函数(Scale-based Dynamic Loss, SDL),通过构建自适应损失调节机制,不仅实现了对YOLOv11检测精度的指数级提升,更重新定义了损失函数的设…...
<项目代码>YOLO小船识别<目标检测>
项目代码下载链接 YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN)࿰…...
我用deepseek做了一个提取压缩文件夹下pdf和word文件工具
由于最近需要把大量的压缩文件的pdf和word文件统一复制到一个文件夹中。 我们一般正常操作方式的是把一个压缩文件一个一个解压,然后在把一个的解压好的文件夹下文件复制到另外一个文件夹中。 这个也需太繁琐了,从以往统计的需要花费两个小时间&#x…...
单例模式 (Singleton Pattern)
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。 核心特点 唯一性:一个类只能有一个实例 全局访问:提供全局访问该实例的方式 延迟初始化:通常在第一次被请求时才创建实…...
01-初识前端
一、邂逅前端开发 1.1. 软件开发、软件开发体系 这儿放个图~ 1.2.完善的应用程序包括哪些? 服务器开发 iOS开发、Android开发 Web开发 桌面开发(windows,mac os) iOS、mac os(OC,swift)&am…...
【JavaWeb后端开发03】MySQL入门
文章目录 1. 前言1.1 引言1.2 相关概念 2. MySQL概述2.1 安装2.2 连接2.2.1 介绍2.2.2 企业使用方式(了解) 2.3 数据模型2.3.1 **关系型数据库(RDBMS)**2.3.2 数据模型 3. SQL语句3.1 DDL语句3.1.1 数据库操作3.1.1.1 查询数据库3.1.1.2 创建数据库3.1.1…...
使用纯前端技术html+css+js实现一个蔬果商城的前端模板!
当我们刚开始学习前端的时候,我们都会先学习一些基础的编程知识点。对于网站开发前端学习,我们就会学习 html css js 等基础的前端技术,我们学习了基础编程知识后,肯定是需要一些项目,或者一些练习题,巩固一…...
SAP系统生产跟踪报表入库数异常
生产跟踪报表入库数异常 交库21820,入库43588是不可能的 原因排查: 报表的入库数取值,是取移动类型321 (即系检验合格后过账到非限制使用)的数. 查凭证,101过账2次21807,321过账了2次21794,然后用102退1次21794.就是说这批物料重复交库了. 解决: 方案一:开发增强设…...
mac 本地 docker 部署 nacos
标题查看 docker 的 nacos 版本 查看可用的Nacos版本,以最新版为例. 指定版本 自己修改即可. 访问Nacos镜像库地址:https://hub.docker.com/r/nacos/nacos-server/tags?page1&orderinglast_updated 标题二、挂载目录配置步骤 标题创建本地目录 按用户要…...
cgroup threaded功能例子
一、背景 cgroup在如今的系统里基本都是默认打开的一个功能。对于cgroup的cpu子系统,默认的颗粒度是进程为维度进行cgroup的cpu及cpuset的控制。而对于一些复杂进程,可能的需求是进程里一些个别线程要绑定在X1-Xn这些cpu核上,而除了这些个别…...
Elasticsearch插件:IDEA中的Elasticsearch开发利器
Elasticsearch插件:IDEA中的Elasticsearch开发利器 一、插件概述 Elasticsearch插件是为IntelliJ IDEA设计的专业工具,它让开发者能在IDE内直接与Elasticsearch集群交互,提供了查询编写、索引管理、数据分析等全方位支持。 核心价值&#…...
electron从安装到启动再到打包全教程
目录 介绍 安装 修改npm包配置 执行安装命令 源代码 运行 打包 先安装git, 安装打包工具 导入打包工具 执行打包命令 总结 介绍 electron确实好用,但安装是真的要耗费半条命。每次安装都会遇到各种问题,然后解决了之后。后面就不需要安装了,但有时候比如电脑重装…...
【Linux】轻量级命令解释器minishell
Minishell 一、项目背景 在linux操作系统中,用户对操作系统进行的一系列操作都不能直接操作内核,而是通过shell间接对内核进行操作。 Shell 是操作系统中的一种程序,它为用户提供了一种与操作系统内核和计算机硬件进行交互的界面。用户可以通…...
KEIL报错解决方案:No Algorithm found for: 08001000H - 080012EBH?
改这里: Cortex JLink/JTrace Target Drive - Flash Download - Size: 配好你这款芯片应该用的空间大小...
用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置
原文链接:用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置 Hello,大家好啊!今天给大家带来一篇在银河麒麟操作系统的 LiveCD 或系统试用镜像环境下,如何查看原系统中电脑的 IP 地址与网络打印机 IP 地址的实用教程。在系统损坏…...
DeepseekV3MLP 模块
目录 代码代码解释导入和激活函数配置类初始化方法前向传播方法计算流程 代码可视化 代码 import torch import torch.nn as nn import torch.nn.functional as F# 定义激活函数字典 ACT2FN {"relu": F.relu,"gelu": F.gelu,"silu": F.silu,&q…...
Ubuntu 系统下安装和使用性能分析工具 perf
在 Ubuntu 系统下安装和使用性能分析工具 perf 的步骤如下: 1. 安装 perf perf 是 Linux 内核的一部分,通常通过安装 linux-tools 包获取: # 更新软件包列表 sudo apt update# 安装 perf(根据当前内核版本自动匹配) …...
安恒Web安全面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
OSPF --- LSA
文章目录 一、OSPF LSA(链路状态通告)详解1. LSA通用头部2. OSPFv2 主要LSA类型a. Type 1 - Router LSAb. Type 2 - Network LSAc. Type 3 - Summary LSAd. Type 4 - ASBR Summary LSAe. Type 5 - AS External LSAf. Type 7 - NSSA External LSA 3. LSA泛…...
IDEA/WebStorm中Git操作缓慢的解决方案
问题描述 在WebStorm中进行前端开发时,发现Git操作(如push、checkout、pull等)特别缓慢,而在命令行(cmd)中执行相同的Git命令却很快,排除了网络问题。 解决方案 通过修改WebStorm安装目录下的runnerw.exe文件名可以…...
网络威胁情报 | Yara
Yara 是一个在威胁情报、数字取证和威胁猎取方面较为常用的语言。本文并非是Yara语言的教程,更多的是希望可以让大家知道这个语言的神奇之处及其在当今信息安全领域的重要性。 Yara 是什么? “恶意软件研究人员(以及其他所有人)…...
12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)
Combo Box QComboBox 表⽰下拉框 核⼼属性 属性说明currentText当前选中的⽂本currentIndex当前选中的条⽬下标.从0开始计算.如果当前没有条⽬被选中,值为-1editable是否允许修改设为true时, QComboBox 的⾏为就⾮常接近 QLineEdit ,也可以 设置 validatoriconSize下拉框图标…...