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是否满足需求。