当前位置: 首页 > news >正文

035_Progress_Dialog_in_Matlab中的进度条对话框

进度条

在这里插入图片描述

概念

在使用Matlab开发界面时,有一个很好用的工具就是进度条。在计算过程中,为用户提供计算进度的反馈是改善用户体验的重要手段。

一项进行的计算任务,如果其总体进度是比较容易量化,则可以按照0%~100%的方式,更新界面上的指示。

当一项任务的进度难以量化,或者只需要提示程序目前正在忙碌之中,则可以提供一个界面动画来提示任务正在进行中。

当然,进度条还可能提供另外一个功能,取消背景任务的功能。

综上所述,进度条的概念提供了三个方面的功能:

  1. 显示任务的量化进度;
  2. 显示非量化的任务进心中;
  3. 提供取消任务的功能。

这在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函数创建。

而参数有以下几类:

  1. 外观:
    1. Message,显示在进度条上面的信息;
    2. Title,对话框的标题
    3. Icon,在进度条左侧显示的图标,采用图像名称或者图像数组
    4. Interpreter,文本的解释器(tex,latex,html),如果动态更新信息或者标题的频率过高,设置解释器可能会降低效率
  2. 进度:
    1. Value,这个是一个 ∈ [ 0 , 1 ] \in [0,1] [0,1]中的数值,就是主要的设定进度的接口
    2. ShowPercentage,是否显示比分比的文本,默认是’off’
    3. Indeterminate,设定不确定的进度,仅仅显示任务进行中
  3. 交互性
    1. Cancelable,是否允许取消,如果设置为on,则显示一个取消按钮
    2. CancelText,设定取消按钮的文本
    3. 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 π的程序,没啥用,效率低,仅仅是为了展示如何使用进度条对话框。

需求:

  1. 用户输入:
    1. 蒙特卡洛采样次数
    2. 启动计算
  2. 用户报表:
    1. 计算的采样次数
    2. 计算得到的 π \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开发界面时&#xff0c;有一个很好用的工具就是进度条。在计算过程中&#xff0c;为用户提供计算进度的反馈是改善用户体验的重要手段。 一项进行的计算任务&#xff0c;如果其总体进度是比较容易量化&#xff0c;则可以按照0%~100%的方式&#xff0…...

【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Ai-Ming主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; defcomplete_sexagenary&#xff08;年&a…...

如何利用SAP低代码平台快速构建企业级应用?

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

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片&#xff08;sharding&#xff0c;水平切分&#xff09;来进行数据共享&#xff0c;并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点&#xff08;node&#xff09;组成&#xff0c;在刚开…...

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码

社团活动与组织 信息发布&#xff1a;系统支持社团发布活动信息、招募新成员等&#xff0c;方便社团进行线上线下活动的组织和管理。 增强凝聚力&#xff1a;通过系统&#xff0c;社团成员可以更好地交流和互动&#xff0c;增强社团的凝聚力和影响力。 生活服务功能 二手市场…...

鸿蒙核心技术理念

文章目录 1)一次开发,多端部署2)可分可合,自由流转3)统一生态,原生智能1)一次开发,多端部署 “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。目的是支撑开发者高效地开发多种终端设备上的应用 2)可分可合,自由流转 元服务是鸿蒙系统提供的一…...

8. 基于 Redis 实现限流

在高并发的分布式系统中&#xff0c;限流是保证服务稳定性的重要手段之一。通过限流机制&#xff0c;可以控制系统处理请求的频率&#xff0c;避免因瞬时流量过大导致系统崩溃。Redis 是一种高效的缓存数据库&#xff0c;具备丰富的数据结构和原子操作&#xff0c;适合用来实现…...

241117学习日志——[CSDIY] [ByteDance] 后端训练营 [05]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d&#xff1a;如果是两位数&#xff0c;将会在前面添上一位0 %.2f&#xff1a;会保留两位小数 如果是long&#xff0c;必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制&#xff1a; 十进制转任意进制时&#xff…...

k8s 学习笔记之 k8s 存储管理

文章目录 概述卷卷的常用类型emptyDir边车容器 HostPathnfsPV/PVC静态供给 PV 和 PVC创建静态 PV创建 pvc创建 pod 应用 pvc 动态供给 PV 和 PVC创建 StorageClass创建 pvc创建 pod 使用 pvc PV 的生命周期 内置存储对象ConfigMapSecret 配置文件自动重新加载方案**1. 应用内动…...

ios swift开发--ios远程推送通知配置

远程推送通知&#xff08;Push Notifications&#xff09;在 iOS 平台上是免费提供的&#xff0c;但需要一些准备工作。以下是开通和使用远程推送通知的基本步骤&#xff1a; 开通远程推送通知 注册 Apple Developer Program&#xff1a; 访问 Apple Developer 并注册一个开发…...

【JavaEE进阶】CSS

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

基于Java Springboot宠物领养救助平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

C/C++ 中有哪些类型转换方式? 分别有什么区别?

在C编写C/C代码的时候&#xff0c;我们经常会遇到发生类型转换的场景&#xff0c;比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同&#xff0c;都会发生类型转换&#xff1b;所以&#xff0c;在C语言中提供了两种类型转换 —— 隐…...

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…...

Scala的Array

数组&#xff1a;物理空间上连续的&#xff08;一个挨一个&#xff09; 优势&#xff1a;根据下标&#xff0c;能快速找到元素 列表&#xff1a;物理空间上不连续&#xff08;不是一个元素挨着一个元素&#xff09; 优势&#xff1a;插入元素&#xff0c;删除比较快 object…...

等保测评怎么做?具体流程是什么?

等保测评是对信息系统进行等保&#xff08;等级保护&#xff09;安全评测的过程。等保是指对信息系统进行等级化保护管理&#xff0c;目的是提高信息系统的安全性&#xff0c;防止信息泄露、篡改、破坏等安全问题。哈尔滨等保测评按照《中华人民共和国网络安全法》及《信息安全…...

基于YOLOv8深度学习的汽车车身车损检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOV8深度学习模型的汽车车身车损检测系统&#xff0c;旨在解决传统车损检测中效率低、精度不高的问题。该系统利用YOLOV8的目标检测能力&#xff0c;在单张图像上实现了车身损坏区域的精确识别和分类&#xff0c;尤其是在车身凹痕、车身裂纹和车身划…...

力扣 LeetCode 144. 二叉树的前序遍历(Day6:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归&#xff08;中左右&#xff09; 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)修图软件入门操作参考,收集查过的各个细节用法

到现在&#xff0c;对于Ai的使用也是一半一半&#xff0c;基本上都是用到啥就查啥。因为用得也不是很频繁&#xff0c;脑子也记不住很多操作&#xff0c;所以有时候靠肌肉记忆&#xff0c;很多时候&#xff0c;得再百度一遍…… 所以 我在这再备份一下&#xff0c;做个搬运工 …...

手把手推导NCP1380准谐振反激公式:用Mathcad复现ON官方计算书(附推导过程)

从零推导NCP1380准谐振反激公式&#xff1a;Mathcad实战全解析 当电源工程师第一次打开NCP1380官方计算书时&#xff0c;那些看似魔术般直接呈现的公式往往让人既兴奋又困惑。兴奋的是有了现成的设计工具&#xff0c;困惑的是这些公式背后的物理本质和数学逻辑被隐藏在技术文档…...

浏览器兼容性问题汇总

1.IE10版本以上浏览器input标签后面自带一个X问题IE10&#xff0c;IE11浏览器当点击input text文本框时&#xff0c;输入文本后出现一个删除功能的X按钮IE浏览器效果&#xff0c;而谷歌浏览器没有解决方案&#xff1a;给input添加如下CSS样式 input::-ms-clear{display:none;}2…...

2026 年终醒悟,AI 让我误以为自己很强,我思考了未来程序员的转型之路

2025 可以说只要是开发者都绕不过 AI &#xff0c;时至今日你说你不用 AI 写代码我是不信的&#xff0c;但是直到最近我才发现&#xff0c;我似乎已经把 AI 的能力当做自己的能力&#xff0c;这种错觉体现在&#xff0c;昨天我用 AI 五分钟做出这下方这个动画效果&#xff1a; …...

哔哩下载姬DownKyi:新手快速上手指南与实战技巧

哔哩下载姬DownKyi&#xff1a;新手快速上手指南与实战技巧 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;…...

ChatTTS在政务热线场景落地:拟真语音提升市民服务体验真实案例

ChatTTS在政务热线场景落地&#xff1a;拟真语音提升市民服务体验真实案例 1. 项目背景与价值 政务热线是政府与市民沟通的重要桥梁&#xff0c;但传统语音系统存在明显痛点&#xff1a;机械化的语音播报缺乏人情味&#xff0c;长时间等待的提示音让市民感到烦躁&#xff0c;…...

KIHU快狐|LCD触摸屏壁挂式酒店信息展示终端

在现代酒店管理中&#xff0c;信息展示终端扮演着至关重要的角色。KIHU快狐的LCD触摸屏壁挂式酒店信息展示终端&#xff0c;凭借其先进的技术和卓越的性能&#xff0c;成为酒店行业的理想选择。高效的信息展示KIHU快狐的LCD触摸屏壁挂式酒店信息展示终端&#xff0c;采用高分辨…...

YOLOv8改进之TransformerHead:将检测头替换为轻量级Transformer预测层,捕捉全局上下文

摘要 在目标检测任务中,YOLOv8凭借其高效的架构和优异的性能表现,已成为工业界和学术界广泛应用的基准模型。然而,YOLOv8传统检测头基于卷积神经网络设计,虽能有效提取局部特征,但在建模全局上下文关系和长程依赖方面存在天然局限。针对这一问题,本文提出了一种创新的改…...

VSCode远程开发必备:SSH端口转发一键配置指南(含常见问题排查)

VSCode远程开发实战&#xff1a;SSH端口转发高效配置与深度排错 当你在咖啡厅修改代码时&#xff0c;远程服务器上的数据库服务突然需要紧急调试&#xff1b;当团队协作时&#xff0c;同事的内网API接口需要临时开放给你测试——这些场景下&#xff0c;SSH端口转发就像一把瑞士…...

NMPC轨迹跟踪:从非线性模型构建到Simulink闭环仿真

1. 非线性模型预测控制&#xff08;NMPC&#xff09;基础入门 第一次接触NMPC时&#xff0c;我也被那些数学公式吓到了。但后来发现&#xff0c;它其实就是个"会看地图的老司机"——通过预测未来几步的路况&#xff0c;提前调整方向盘。与传统的MPC相比&#xff0c;N…...

从DEM到决策:如何用QGIS分析河北地形,为生态保护与项目选址提供依据?

从DEM到决策&#xff1a;QGIS地形分析在河北生态保护与项目选址中的实战指南 河北省复杂的地形地貌为各类生态保护和工程项目带来了独特挑战。作为华北地区生态屏障与经济发展的重要区域&#xff0c;如何科学评估地形特征直接影响着规划决策的质量。本文将带您用QGIS这一开源工…...