Matlab APP designer可以同时设计好几个APP,并一定程度上可以互相交流数据。我看网上资料的时候,总觉得的讲的特别的不直观,我自己多方尝试后,多APP之间的简单数据传输方式,从整体方式上来看,我感觉特别像两个电脑的远程控制系统,如果你用过向日葵、或者QQ远程控制,就比较容易理解。首先以 远程控制软件,向日葵为例,先建立一个基础的认识:
如果电脑1需要对电脑2进行数据传输或者远程操控,那么电脑1里面的向日葵1界面的设备列表里面就应该有电脑2的名字才行:
那么在Matlab APP designer的APP中担任设备列表功能的就是:App输入参数
这个操作只需要在2个app中的任一个设置对方名字即可,只要有一个保存过名字,两个就可以交流
接下来,介绍主要会用到的一些需求操作:
回调函数有两种写法:(这个操作主要是在设计登录界面的时候会需要)在一个app的代码视图中,其中的“app”标识都默认指代自己,所以代码中的delete(app)表示关闭app1自己。
该按钮的回调函数如下:
(嘿嘿:写完第二部分,回来补充个了方法3)
%方法1:不需要任何其他初始设置
run app2;
delete(app);
%方法2:在app输入参数中写了app2名字后
app2;
delete(app);
%方法3:在app输入参数中写了app2名字后,随便写个参数=app2
flower2=app2;
delete(app);
这里你可能要问,用方法2打开App2以后,是不是可以直接delete(app2)关闭app2 ??
答案是不能。
这里就要介绍在数据交互中的另一个重要设置,就是各自在自己代码里设置一个称呼指代对方的代号;
也就是说,虽然我们列表里有名字,打开app2,就像向日葵中选中列表后点击了 桌面控制或远程文件,然后电脑2的视图可以看到了,但是远程控制在电脑2上写东西时,用的鼠标键盘都是我电脑1的,我是不认识你电脑2的,所以此时的远程控制界面写了个代码,
“在该界面上,电脑2=电脑1”,
然后鼠标键盘就可以用了,但是都用电脑1这个名字,老得切换,干脆给电脑2另起一个代号,就叫 ”flower2“吧(程序就是flower2=电脑2),然后电脑1的代码里就可以用flower2在电脑2上操作了。
(注:以上是我的一个抽象联想,便于理解,当然不认同这种描述也可以)
在官方文档里好像是叫设置侦听什么的,一般的操作就是在各自的代码视图中,选择 属性-私有属性,设置一个参数,比如flower2,使用方式有3种:
其中方式2和方式3都属于开机自启项,打开app1的时候,app2会直接弹出来。在方式1中,是点击操作后,才会执行。(以上这些其实也都是打开app2的方式,可以补充到第一部分里面去)
(注1:这个并不是必须两个都要设置,如果你的需求是单向的,只想用app1控制app2,那就只在app1中设置就行了。
注2:还有设置成私有属性参数,其实是为了当全局变量,如果你只在一个按钮里有控制操作,那不设置全局变量也可以。)
此时我们可以操作之前遗留的delete(app2)命令了,就是写成delete(app.flower2)
了解了第2部分,我们来实战演练一下:
首先环境设置:
1、在app1的app输入参数中写上app2;
2、在app1的私有属性中写入参数 flower2;
操作1:黄色框框1-打开app2,并输入app2最喜欢的数
首先现在下面的白色框里填一个数,比如7,然后设置按钮黄框1的回调函数:
% 打开app2
app.flower2=app2;
% app.flower2.EditField中的EditField是app2中那个白色框的名字
% app.EditField.Value中EditField是app1里面的输入7的那个白色框的名字
% 注意引用正确的名字
app.flower2.EditField.Value=app.EditField.Value;
操作2: 黄色框框2-导入app2最喜欢的图
首先找一张图,然后设置按钮黄框2的回调函数:
%读取图片
im=imread('apppicture.PNG');
%在app2中显示图片
imshow(im,'Parent',app.flower2.UIAxes);
操作3:绿色框框1-app2最喜欢的数是?
按钮绿框1的回调函数:
%从app2的数值框中读取,写入绿框1下面的数值框里
app.EditField_2.Value=app.flower2.EditField.Value;
操作4:绿色框框2-app2最喜欢的图是?
按钮绿框2的回调函数:
%从app2中复制图像
copyobj(app.flower2.UIAxes.Children,app.UIAxes);
这里我也不太清楚为什么复制回来的图是倒的,因为我用的版本是2018b,没有图像组件,只能用坐标区组件来导入图。但是如果是复制正常的数据绘制的坐标区图,结果是正常的。
可能还是升级成新版本更方便一些。
操作5:关闭app2
回调函数:
delete(app.flower2)
关于有些教程中会用到公共函数、公共属性等传递数据,其实它们的用法和私有函数、私有属性是一样的,本质是为了做全局参数,并不完全是为了传递数据的,更多是为了方便计算的。可以根据自己的需求应用。