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的使用也是一半一半,基本上都是用到啥就查啥。因为用得也不是很频繁,脑子也记不住很多操作,所以有时候靠肌肉记忆,很多时候,得再百度一遍…… 所以 我在这再备份一下,做个搬运工 …...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...