035_Progress_Dialog_in_Matlab中的进度条对话框
进度条
概念
在使用Matlab开发界面时,有一个很好用的工具就是进度条。在计算过程中,为用户提供计算进度的反馈是改善用户体验的重要手段。
一项进行的计算任务,如果其总体进度是比较容易量化,则可以按照0%~100%的方式,更新界面上的指示。
当一项任务的进度难以量化,或者只需要提示程序目前正在忙碌之中,则可以提供一个界面动画来提示任务正在进行中。
当然,进度条还可能提供另外一个功能,取消背景任务的功能。
综上所述,进度条的概念提供了三个方面的功能:
- 显示任务的量化进度;
- 显示非量化的任务进心中;
- 提供取消任务的功能。
这在UI/UX中,是三个不同的概念。
此外,在使用进度条中,还有一个需要分析清楚的需求。也就是是否需要有并行的才做。这就决定在显示进度条的对话框(窗口)是模式对话框还是非模式对话框。
- 模式对话框:必须关闭对话框才能操作父窗口;
- 非模式对话框:无需关闭对话框,可以把焦点切换到父窗口,与其中的控件交互。
这两种模式的对话框用途略有不同,模式对话框采取了中断用户操作的方式,使用户的全部注意力集中于当前对话框中;而非模式对话框则是提供独立的额外信息,随时可以关闭、置于后台和查看。通过用户体验进行需求分析,很容易就可以确定使用哪种对话框。
- 如果程序只有一项中心任务正在进行,且不便于或者无需提供其它交互,则进度条选择模式对话框
- 如果是一项背景任务或者异步任务,这更适合选择非模式对话框来实现进度条,或者把进度条放置于当前窗口中的某个位置(如状态栏)
在Matlab这种以计算为核心的环境中,大部分时候都会把主要的资源集中用于数值计算,所以模式对话框来显示进度、提供取消的功能可能会更加符合逻辑。
工具
在以uifigure
为基础的App开发中,提供了一系列对话框和通知的工具:
函数 | 作用 |
---|---|
uialert | 显示警报对话框 |
uiconfirm | 创建确认对话框 |
uiprogressdlg | 创建进度对话框 |
uisetcolor | 打开颜色选择器 |
uigetfile | 打开文件选择对话框 |
uiputfile | 打开用于保存文件的对话框 |
uigetdir | 打开文件夹选择对话框 |
uiopen | 打开文件选择对话框并将选定的文件加载到工作区中 |
uisave | 打开用于将变量保存到 MAT 文件的对话框 |
进度条对话框
语法
进度条是一个对话框,名字都称为是dlg
。调用的方式:
d = uiprogressdlg(fig)
d = uiprogressdlg(fig,Name,Value)
调用的第一个参数是不能省略的,对应一个图窗,必须采用uifigure
函数创建。
而参数有以下几类:
- 外观:
Message
,显示在进度条上面的信息;Title
,对话框的标题Icon
,在进度条左侧显示的图标,采用图像名称或者图像数组Interpreter
,文本的解释器(tex
,latex
,html
),如果动态更新信息或者标题的频率过高,设置解释器可能会降低效率
- 进度:
Value
,这个是一个 ∈ [ 0 , 1 ] \in [0,1] ∈[0,1]中的数值,就是主要的设定进度的接口ShowPercentage
,是否显示比分比的文本,默认是’off’Indeterminate
,设定不确定的进度,仅仅显示任务进行中
- 交互性
Cancelable
,是否允许取消,如果设置为on
,则显示一个取消按钮CancelText
,设定取消按钮的文本CancelRequest
,是否已经请求取消的属性,如果已经按下取消按钮,这个值就是true
,程序可以选择相应的处理。
在创建过程中,可以设定这些值,也可以采用仅仅传入fig
的方式调用,后续采用属性的方式设定。
dlg = uiprogressdlg(fig);
dlg.Icon = "logo.png";
dlg.Cancelable = 'on';
dlg.CancelText = "Stop";% ...d.Message = "step 1 done";
d.Value = 0.55
% 更新进度的位置
这里还需要提一下Cancelable
这个属性,如果这个属性设置为false
,那么进度条对话框是没有关闭按钮的;如果这个属性设置为true
,则进度条对话框有一个关闭按钮(窗体右上角),这个关闭按钮和取消按钮的作用完全一样。
示例
接下来就是一个例子,我们实现一个用蒙特卡洛采样计算 π \pi π的程序,没啥用,效率低,仅仅是为了展示如何使用进度条对话框。
需求:
- 用户输入:
- 蒙特卡洛采样次数
- 启动计算
- 用户报表:
- 计算的采样次数
- 计算得到的 π \pi π
经过设计,大概界面如下:
点击计算之后,显示计算过程的信息。
function f = calculationProgressf = uifigure(Visible=false, Name="又一个计算圆周率的没用程序(更别说计算效率感人)");g = uigridlayout(f, [3, 1], RowHeight={50, '1x', 100});startBut = uibutton(g, Text="开始计算", ButtonPushedFcn={@startCalculation, f});
startBut.Layout.Row = 1;
startBut.Layout.Column = 1;% line
g1 = uigridlayout(g, [1, 2], ColumnWidth={150, "1x"});
g1.Layout.Row=2;
g1.Layout.Column=1;l = uilabel(g1);
l.Layout.Row = 1;
l.Layout.Column=1;slider = uiknob(g1, Limit=[1, 100], Value=2, ValueChangedFcn={@setText, l});
slider.Layout.Row = 1;
slider.Layout.Column = 2;setText(slider, [], l);output = uilabel(g, Text="", Interpreter="latex", HorizontalAlignment='center', VerticalAlignment="center");
output.Layout.Row = 3;
output.Layout.Column = 1;cm = uicontextmenu(f);
uimenu(cm, Text="拷贝圆周率", MenuSelectedFcn={@copyToClipboard, f});
output.ContextMenu = cm;f.UserData = struct(..."piValue", nan, ..."startBut", startBut,..."output", output,..."slider", slider );f.Visible = true;
end
这里的界面布局用一个列布局( N × 1 N\times 1 N×1网格)嵌套一个行布局( 1 × N 1\times N 1×N网格)的方式。整个界面的构造,非常直观。
计算和进度
按钮的动作调用回调函数ButtonPushedFcn={@startCalculation, f}
,这里把uifigure
传输到函数中,也作为uiprogressdlg
的父节点,这就使得进度条对话框只能在图窗的范围内移动。
function startCalculation(~, ~, fig)output = fig.UserData.output;
startBut = fig.UserData.startBut;
startBut.Enable = false;N = fig.UserData.slider.Value * 1024;
insideCount = 0.0;
idx = 0.0;d = uiprogressdlg(fig, ...Icon="matlab.png", ...Title="计算中...", ...ShowPercentage=true, ...Cancelable=true,...CancelText="够了,够了!");for i = 1:Nif d.CancelRequestedbreak;endx = rand;y = rand;idx = idx + 1;if (x * x + y * y < 1)insideCount = insideCount + 1;endestPi = 4 * insideCount / idx;fig.UserData.piValue = estPi;d.Value = idx / N;d.Message = sprintf("当前vs计划采样:%.0f / %.0f\n当前估计圆周率:%.8f", idx, N, estPi);
endoutput.Text = sprintf("共采样:%.0f 次\n估计得:\\tilde{\\pi}=%.8f", idx, estPi);startBut.Enable = true;end
这里在循环内部,设定进度条的状态:
d.Value = idx / N;
d.Message = sprintf("当前vs计划采样:%.0f / %.0f\n当前估计圆周率:%.8f", idx, N, estPi);
整个概念和使用都是极为直观的。
其它内容
上面的uiknob
是一个模拟的旋钮。
回调函数中对应有一个旋钮的设置函数,ValueChangedFcn={@setText, l}
,这个函数就把旋钮的值在旁边的uilabel
上显示出来。
function setText(src, ~, l)
l.Text = sprintf("设定采样次数: 1024*%.0f", src.Value);
end
这里还增加了一个把估计得到的 π \pi π值拷贝到剪贴板的上下文菜单。这个上下文菜单中,uicontextmenu
的父节点为一个图窗;MenuSelectedFcn={@copyToClipboard, f}
是对应的动作回调;创建好之后,要把菜单与输出的标签相关联。
值得注意的是,这里的uimenu
的父节点为uicontextmenu
,如果其父节点是uifigure
,则是窗口的菜单。
cm = uicontextmenu(f);
uimenu(cm, Text="拷贝圆周率", MenuSelectedFcn={@copyToClipboard, f});
output.ContextMenu = cm;
这个回调函数非常简单,调用clipboard('copy', piValue);
即可。
function copyToClipboard(~, ~, f)
piValue = f.UserData.piValue;
% add value to copy/paste pad
clipboard('copy', piValue);
end
总结
这个可以取消的进度条,在实际使用中应该足够保守,仅仅用于那些长时间计算、并且在计算中不允许用户进行其它交互的场合。不然,过于激进地使用模式对话框还是很容易影响用户体验的。
相关文章:

035_Progress_Dialog_in_Matlab中的进度条对话框
进度条 概念 在使用Matlab开发界面时,有一个很好用的工具就是进度条。在计算过程中,为用户提供计算进度的反馈是改善用户体验的重要手段。 一项进行的计算任务,如果其总体进度是比较容易量化,则可以按照0%~100%的方式࿰…...

【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯GPTs指令💯前言💯Ai-Ming主要功能适用场景优点缺点 💯小结 💯GPTs指令 中文翻译: defcomplete_sexagenary(年&a…...

如何利用SAP低代码平台快速构建企业级应用?
SAP作为全球领先的企业管理软件解决方案提供商,一直致力于为企业提供全面且高效的业务管理工具。随着技术的快速发展,传统的开发方式已经无法满足企业在快速变化的市场环境下的需求。低代码开发平台应运而生,它通过简化应用程序的创建过程&am…...

Redis设计与实现 学习笔记 第十七章 集群
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding,水平切分)来进行数据共享,并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点(node)组成,在刚开…...

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码
社团活动与组织 信息发布:系统支持社团发布活动信息、招募新成员等,方便社团进行线上线下活动的组织和管理。 增强凝聚力:通过系统,社团成员可以更好地交流和互动,增强社团的凝聚力和影响力。 生活服务功能 二手市场…...

鸿蒙核心技术理念
文章目录 1)一次开发,多端部署2)可分可合,自由流转3)统一生态,原生智能1)一次开发,多端部署 “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。目的是支撑开发者高效地开发多种终端设备上的应用 2)可分可合,自由流转 元服务是鸿蒙系统提供的一…...
8. 基于 Redis 实现限流
在高并发的分布式系统中,限流是保证服务稳定性的重要手段之一。通过限流机制,可以控制系统处理请求的频率,避免因瞬时流量过大导致系统崩溃。Redis 是一种高效的缓存数据库,具备丰富的数据结构和原子操作,适合用来实现…...
241117学习日志——[CSDIY] [ByteDance] 后端训练营 [05]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...

蓝桥杯备赛(持续更新)
16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d:如果是两位数,将会在前面添上一位0 %.2f:会保留两位小数 如果是long,必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制: 十进制转任意进制时ÿ…...
k8s 学习笔记之 k8s 存储管理
文章目录 概述卷卷的常用类型emptyDir边车容器 HostPathnfsPV/PVC静态供给 PV 和 PVC创建静态 PV创建 pvc创建 pod 应用 pvc 动态供给 PV 和 PVC创建 StorageClass创建 pvc创建 pod 使用 pvc PV 的生命周期 内置存储对象ConfigMapSecret 配置文件自动重新加载方案**1. 应用内动…...
ios swift开发--ios远程推送通知配置
远程推送通知(Push Notifications)在 iOS 平台上是免费提供的,但需要一些准备工作。以下是开通和使用远程推送通知的基本步骤: 开通远程推送通知 注册 Apple Developer Program: 访问 Apple Developer 并注册一个开发…...

【JavaEE进阶】CSS
本节⽬标 掌握 CSS 基本语法规范和CSS选择器的各种⽤法, 熟练使⽤CSS的常⽤属性. 一.CSS介绍 1.什么是CSS? CSS(Cascading Style Sheet),层叠样式表, ⽤于控制⻚⾯的样式. CSS 能够对⽹⻚中元素位置的排版进⾏像素级精确控制, 实现美化⻚⾯的效果. 能够做到⻚⾯…...

基于Java Springboot宠物领养救助平台
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
C/C++ 中有哪些类型转换方式? 分别有什么区别?
在C编写C/C代码的时候,我们经常会遇到发生类型转换的场景,比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同,都会发生类型转换;所以,在C语言中提供了两种类型转换 —— 隐…...

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案
内容概要 在这个数字化飞速发展的时代,小程序租赁系统应运而生,成为企业管理租赁业务的一种新选择。随着移动互联网的普及,越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…...
Scala的Array
数组:物理空间上连续的(一个挨一个) 优势:根据下标,能快速找到元素 列表:物理空间上不连续(不是一个元素挨着一个元素) 优势:插入元素,删除比较快 object…...
等保测评怎么做?具体流程是什么?
等保测评是对信息系统进行等保(等级保护)安全评测的过程。等保是指对信息系统进行等级化保护管理,目的是提高信息系统的安全性,防止信息泄露、篡改、破坏等安全问题。哈尔滨等保测评按照《中华人民共和国网络安全法》及《信息安全…...

基于YOLOv8深度学习的汽车车身车损检测系统研究与实现(PyQt5界面+数据集+训练代码)
本文研究并实现了一种基于YOLOV8深度学习模型的汽车车身车损检测系统,旨在解决传统车损检测中效率低、精度不高的问题。该系统利用YOLOV8的目标检测能力,在单张图像上实现了车身损坏区域的精确识别和分类,尤其是在车身凹痕、车身裂纹和车身划…...

力扣 LeetCode 144. 二叉树的前序遍历(Day6:二叉树)
解题思路: 方法一:递归(中左右) class Solution {List<Integer> res new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {recur(root);return res;}public void recur(TreeNode roo…...
Adobe Illustrator(Ai)修图软件入门操作参考,收集查过的各个细节用法
到现在,对于Ai的使用也是一半一半,基本上都是用到啥就查啥。因为用得也不是很频繁,脑子也记不住很多操作,所以有时候靠肌肉记忆,很多时候,得再百度一遍…… 所以 我在这再备份一下,做个搬运工 …...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...