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

MATLAB GUI界面设计 第七章——高级应用

参考教程:MATLAB App Designer基础教程Matlab GUI界面设计(全集更新完毕-用户界面设计appdesigner(中文)Matlab Gui教程_哔哩哔哩_bilibili

一、App打开另一个App

1、run命令和delete命令

(1)run命令可以打开另一个界面,相当于创建另一个界面的对象,具体使用方法如下:

run <app文件名.mlapp>

(2)delete命令可以销毁一个对象,比如界面对象,销毁界面对象相当于关闭界面对象对应的APP窗口,具体使用方法如下:

delete <对象名>

2、案例——低配QQ登录器

(1)新建一个工程,在UIFigure中添加如下组件。

(2)为“登录”按钮添加回调函数,当用户输入正确的账号和密码(本案例默认均为“114514”)后再按登录,即为成功登录,显示打开另一个App界面,并销毁原来的登录界面,否则提示用户“账号或密码错误”。

% 获取用户输入的账号和密码
account = app.EditField.Value;
password = app.EditField_2.Value;% 判断账号和密码是否匹配,是则登录
if account == "123456" && password == "123456"delete(app.UIFigure); % 删除登录界面run QQ.mlapp; % 打开另一个界面
elseerrordlg('账号或密码错误','提示');
end

(3)保存文件后点击“运行”,测试APP是否满足需求(登录成功后跳转到的界面还未进行设计,所以当登录成功后看到的应该是一个空窗口)。

二、通过工作区与Simulink交互

1、assignin分配函数

(1)使用分配函数可以实现在App中为工作区的变量赋值。

(2)使用方法:assignin(WS, 'name', V)。要想实现为工作区中的变量赋值,WS取值'base','name'为工作区中要赋值的变量名,V为值。

2、sim函数

(1)使用sim函数可以调用外部Simulink文件进行仿真并获取仿真结果。

(2)使用方法:sim('MODEL','PARAMETER_NAME1',VALUE1,'PARAMETER_NAME2',VALUE2, ...)。其中'MODEL'为Simulink模型文件名,后续的参数双双成对,第一个是仿真参数名(如'StopTime'——仿真停止时间),第二个是设置的仿真参数值,函数会将仿真结果通过结构体打包返回。

3、案例——动态图像显示器

(1)动态图像显示器的前端设计如下,用户拖动滑块后按下“开始”按钮,可以在坐标区中获得根据用户设置的幅值和仿真时间仿真的正弦波图像。

(2)编写“开始”按钮的回调函数,具体执行的操作为将用户设置的幅值传递到工作区中,并调用外部Simulink模型进行仿真,获取仿真结果(sim函数会返回一个结构体,仿真结果在结构体中),将图像显示在坐标区中。

% 将用户设置的幅值传递到工作区中
assignin('base','Amp1',app.AMPLSlider.Value);% 调用Simulink模型仿真,设置仿真结束时间,并获取结果
simout = sim('sin_model','StopTime', num2str(app.durationSlider.Value));% 将图像绘制在坐标区
plot(app.UIAxes, simout.SineValue.Time, simout.SineValue.Data);

(3)创建Simulink模型文件,命名为“sin_model”,并按下图所示建模。

①正弦波发生器的输出要通过To Workspace模块传递至工作区中,这个输出需要有一个变量名,sim函数返回的结构体成员中会包含此变量的时间-数值关系(包含在一个结构体中,结构体名即为变量名,其成员分为时域和值域,各为一个矢量,其中的元素一一对应)。

②求解器要做相应配置,主要是需要使用离散求解器,并设置仿真步长。

③需要注意正弦波发生器的幅值要从工作区中获取,当用户点击“开始”按钮后,就会在工作区创建Ampl变量,Simulink直接获取即可。

(4)保存文件后点击“运行”,测试APP是否满足需求。

(5)在CPU算力够高的前提下,可以直接移除“开始”按钮,并为两个滑块添加ValueChangingFcn回调函数,只要用户拖动滑块,就实时调用sim函数获取仿真结果,并改变函数图像,此处不再演示。

三、类和对象基础知识

1、app类

(1)每个App类都是继承APPBase类定义的,在MATLAB中“<”可以表示继承关系,具体语法如下:

classdef <.mlapp文件名> < matlab.apps.AppBase

(2)当打开一个App时,意味着创建了一个App对象,这个App对象下会包含许多成员以及回调函数。

2、公共与私有

(1)公共属性与私有属性:

①公共属性:对象的公共属性可被对象本身和外部访问。

[1] 定义:

properties (Access = public)Property % 在此处书写公共变量名即可,换行可定义下一个
end

[2] 类内访问:

app.Property % “app”的作用类似于C++中的this指针(不过用法不完全一致)

[3] 类外访问:

<对象>.Property

②私有属性:对象的私有属性仅可被对象本身访问。

[1] 定义:

properties (Access = private)Property % 在此处书写私有变量名即可,换行可定义下一个
end

[2] 类内访问:

app.Property % “app”的作用类似于C++中的this指针(不过用法不完全一致)

(2)公共函数与私有函数:

①公共函数:对象的公共函数可被对象本身和外部调用。

[1] 定义:

methods (Access = public)function <返回值> = <函数名>(app, <形参列表>)  % 可定义若干函数% 函数体end
end

[2] 类内调用:

<接收返回值变量> =<函数名>(app, <实参列表>) % “app”的作用类似于C++中的this指针(不过用法不完全一致)

[3] 类外调用:

<接收返回值变量> =<对象>.<函数名>(<实参列表>)

②私有函数:对象的私有函数仅可被对象本身调用。

[1] 定义:

methods (Access = private)function <返回值> = <函数名>(app, <形参列表>)  % 可定义若干函数% 函数体end
end

[2] 类内调用:

<接收返回值变量> =<函数名>(app, <实参列表>) % “app”的作用类似于C++中的this指针(不过用法不完全一致)

四、多App交互(类间数据传输)

1、监听变量与App对象创建

(1)App对象创建的语法如下,其中实参列表对应App的StratFcn函数的形参列表,也就是说,在App被创建时,App的StratFcn函数会被自动调用。

app.<监听变量> = <.mlapp文件名>(<实参列表>)

(2)在App类中可以定义一个监听变量,命名通俗易懂即可(建议包含另一个App的全称)。

①创建另一个App对象时可将其保存在监听变量中,当主App需要与子App交互时,可通过监听变量实现信息传递。

②创建另一个App对象时可将自身通过StratFcn函数参数传递至另一个App,另一个App将其保存在它的监听变量中,当子App需要与主App交互时,可通过监听变量实现信息传递。

(3)StratFcn函数的形参不能直接在代码视图中修改,要想增加形参,按照下图所示操作即可。

2、案例——温度调节器(调节区与显示区分离)

(1)前端设计:

①新建一个工程,命名为“instrumentAPP”,在UIFigure中添加如下组件,两个仪表分别用于显示两个温度,用户点击“打开调节窗口”按钮后会打开另一个APP。

②再新建一个工程,命名为“regulatorAPP”,在UIFigure中添加如下组件,两个旋钮分别调节两个温度。

(2)后端设计:

①为“regulatorAPP”的UIFigure添加StartFcn回调函数,其中实现的内容为将打开自己的App保存在监听变量(在私有属性中定义监听变量)中,并将旋钮的值初始化为0。

properties (Access = private)CallerApp % 监听变量,监听创建自己的App
end
—————————————————————————————————————
function startupFcn(app, caller)% 将打开自己的App保存在监听变量中app.CallerApp = caller;% 将旋钮的值初始化为0app.Knob.Value = 0;app.Knob1.Value = 0;
end

②为“instrumentAPP”的按钮组件添加回调函数,其中实现的内容为创建一个regulatorAPP对象并保存在监听变量(在私有属性中定义监听变量)中。

properties (Access = private)regulatorApp % 监听变量,监听创建的App
end
—————————————————————————————————————
function ButtonPushed(app, event)% 创建一个regulatorAPP对象并保存在监听变量中app.regulatorApp = regulatorAPP(app);
end

③为“regulatorAPP”的两个旋钮分别添加ValueChangingFcn回调函数,其中实现的内容为将各自的旋钮值分别显示在“instrumentAPP”的对应仪表上。

function KnobValueChanging(app, event)% 获取旋钮组件数值changingValue = event.Value;% 将数值显示在“instrumentAPP”的对应仪表上app.CallerApp.Gauge.Value = changingValue;
end
—————————————————————————————————————
function Knob2ValueChanging(app, event)% 获取旋钮组件数值changingValue = event.Value;% 将数值显示在“instrumentAPP”的对应仪表上app.CallerApp.Gauge2.Value = changingValue;
end

(3)保存文件后点击“运行”(运行instrumentAPP),测试APP是否满足需求。

http://www.lqws.cn/news/564643.html

相关文章:

  • 机器学习8——神经网络下
  • 手机流量监控App(GlassWire)使用指南
  • WPF两种绑定方式的分析
  • ACE之ACE_Dev_Poll_Reactor
  • 高性能 List 转 Map 解决方案(10,000 元素)
  • 阿里云-接入SLS日志
  • HarmonyOS NEXT仓颉开发语言实战案例:健身App
  • HarmonyOS NEXT仓颉开发语言实战案例:小而美的旅行App
  • [分布式并行] 流水线并行 PP(NaivePP/GPipe/F-then-B/PipeDream/1F1B)
  • MCPA2APPT 智能化演示文稿系统:A2A、MCP、ADK 三大架构全流程自动化
  • 区块链技术: 稳定币USDC的工作原理
  • 【八股消消乐】消息队列优化—消息丢失
  • python pyecharts 数据分析及可视化(2)
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(三)- 职位数据统计分析
  • MAC 地址在 TCP 网络中的全面解析:从基础概念到高级应用
  • 【Redis原理】Redis事务与线程模型
  • StarRocks 3.5 新特性解读:Snapshot 快照恢复、大导入性能全面升级、分区管理更智能
  • opensuse/debian grub启动界面太模糊?
  • Wpf布局之WrapPanel面板!
  • 3.1.1、CAN总线单个设备环回测试
  • Git常见使用
  • WPF学习笔记(11)数据模板DataTemplate与数据模板选择器DataTemplateSelector
  • Mybatis学习总结
  • 鸿蒙5:自定义构建函数
  • 力扣第84题-柱状图中最大的矩形
  • Leetcode 3600. Maximize Spanning Tree Stability with Upgrades
  • Docker安装的gitlab配置ssl证书
  • 协作机器人优化自动化工作流程,提升工作效率
  • vue3报错No known conditions for “./lib/locale/lang/zh-cn”
  • HTML响应式Web设计