我纠结了两个星期是否要写这一章…最后决定还是要写一章收尾,来解释其中的控件间的数据传递问题。

在前五篇中,如果有童鞋跟上了我的思路或者做完了这样一个gui,会发现还有一个一直避开的遗留问题,就是将歌曲信息从播放键里读取后再在诸如volumeSlider(操控音量的滑动条)或Axes(展示波形)中使用这些歌曲信息时,使用GUIDE时,在很多时候数据是不能直接跨控件使用的;即会有控件间的数据传递问题。这这篇文章中我将介绍我主要用到的几种方法。

那么,

控件间的数据传递有哪些方法呢?

首先是最为简单粗暴通用第一种,使用global函数,直接把多个控件要使用的变量做成全局变量;即在要使用这个变量的控件的回调函数的开头都写上‘global+空格+变量名’这个形式的代码,这个变量就完成了多个控件间的数据传递。我个人在这个项目中就将播放器主体audioplayer做成了全局变量。

  • 优点:大概是看起来很方便,加上很方便编写吧(小项目中)
  • 缺点:用专业的话来说,就是“破坏了程序的封装性”;这种方法中变量的改变牵一发而动全身,小项目倒无所谓,大项目很容易弄出奇怪的bug...

接下来,我们就要根据所适合的不同情景而介绍不同的方法了;

首先当然是简单的情景;即我们做的gui只有一个figure时(关于figure的问题见下图:

一条简单的关系
  • root,可以理解为电脑屏幕
  • figure,就是一个界面
  • axes,就是一个坐标轴
  • uicontrol,就是按钮、文本框等等控件
  • uimenu和uicontextmenu分别是界面菜单和右键点击某对象时屏幕上弹出的菜单,但此项目中暂时没用到这些

回到正题上来,当只有一个figure时,可想而知一切的控件都从属于同一个figure,这也就是为什么这种情况的参数传递会简单一些的原因。这种情况下,有:

第二种方法,使用userdata传递数据,每一个控件的属性中都一定有且仅有一个userdata属性,可以使用它来存取不同的数据,我在本次项目中用它存取了歌曲名等信息;使用的时候就像这样:

%将数据a存在listbox控件中

  • 优点:使用简单!思路理起来也不乱
  • 缺点:每个控件只有一个userdata属性...要传递的数据多且杂时,且用且珍惜吧

第三种方法,使用handles和guidata函数传递参数,使用方法如下:

%在控件中存数据a
a = 1;
handles.a = a;
guidata(hObject,handles);
%上面这两句必须连写!!!!!
%画面转到需要a的另一个控件
a = handles.a;%取出数据

  • 优点:个人感觉不是很好用...就没使用
  • 缺点:大概是不好写吧

当有好几个figure时怎么办???

当gui中有多个figure时,由于上面讲过的结构原因,数据传递会麻烦那么一些,就是

第四种,使用application数据,我在本次项目中就是用这个函数进行歌曲波形信息的存取的。主要函数的使用方法如下:

%在figure2中存数据a,并在figure1中读取
a = 1;
setappdata(figure1,'a',a);
%画面转到figure1中读取时
a = getappdata(figure1,'a');

  • 优点:泛用性高,多个figure一个figure都能用,数据多少都能用
  • 缺点:每调用一次所用的figure就要初始化一次,有点慢?
  • 改良:可以使用setappdata(0,'a',a);将a放入工作区做成全局变量,这样可以达到global的效果却不会有global的坏处。

后面这两种个人认为实用性不太高。。。列举如下:(当然也有可能是在别的项目中特殊情景而会选择后面这两种

  • 第五种,用save和load直接存/读文件
  • 第六种,用gui本身的varargin、varargout传递数据

还有一个第七种,就是用.m文件本身的参数来传递,事实上我在本次项目中是使用了这个方法的,不过并非用来传递数据(当然传递数据也是可以的),

我在编写时,发现播放键、上一首、下一首和双击播放列表等多个操作中有大段重复的部分;处于精简代码的考虑,就另外编了一个.m文件并多次调用,大概能使代码看起来更精简,思路更清晰吧。

咳咳,对传递方法做一个总结吧:

  1. 使用global函数
  2. 使用userdata属性
  3. 使用handles和guidata函数
  4. 使用application数据
  5. 用save和load直接存/读文件
  6. 用gui本身的varargin、varargout传递数据
  7. 用.m文件本身的参数

参考:

参考的一篇文章

matlab figure函数_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (六)控件间的数据传递...相关推荐

  1. matlab中GUI的属性检查器中的XLimMode是什么_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (二)GUIDE...

    咕咕怪由于昨天有重要的事情所以咕了一天的文章 (感觉写得挺基础的,对各个部分有一定了解的童鞋可以直接跳过了解的部分 用Matlab做一个app有几种办法呢? 同样的,帮助文档告诉了我们答案:三种. 英 ...

  2. 在HarmonyOS中实现基于JS卡片的音乐播放器

    /   今日科技快讯   / 近日,苹果首席执行官蒂姆·库克接受<时代>杂志专访,谈及他本人对领导力.企业价值和新技术的看法.库克表示,苹果不仅要引领创新,还要努力让世界变得更安全更公平, ...

  3. html中加入音乐播放器,4个小时实现一个HTML5音乐播放器

    技术点:ES6+Webpack+HTML5 Audio+Sass 这里,我们将一步步的学到如何从零去实现一个H5音乐播放器. 首先来看一下最终的实现效果:Demo链接 => 界面: skPlay ...

  4. matlab cat函数_如何用Matlab编写贪吃蛇游戏?(持续更新)

    今后我们实验室的研究重点将会聚焦在"基于游戏的测评"和"教育游戏化"这两个主题上,因此很有必要研究实现"爆款"游戏的一些基本的技术方法.这篇 ...

  5. iserror 函数_如何在Excel中使用CLEAN,FIND和ISERROR工作表函数

    iserror 函数 Excel工作表中提供了很多功能,因此用户经常坚持使用最常用的功能,直到他们开始探索尝试找到问题的解决方案为止. 有时候,甚至没有想到可能有一个功能可以解决该问题. 因此,我决定 ...

  6. java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...

    如今,深度学习模型处于持续的演进中,它们正变得庞大而复杂.研究者们通常通过组合现有的 TensorFlow 或 PyTorch 操作符来发现新的架构.然而,有时候,我们可能需要通过自定义的操作符来实现 ...

  7. python中case的用法_如何在Python中使用TestCase实现一个断言功能

    如何在Python中使用TestCase实现一个断言功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题. Python TestCase断 ...

  8. android 开启dlna音乐服务_新品丨数字流媒体新宠——Stack Audio Link USB音乐播放器...

    流媒体播放器在如今的音响领域中不算新鲜,从流媒体播放器上各个品牌都有属于自己的产品,今天笔者给大家介绍数字流媒体播放器的新宠儿英国Stack Audio Link音乐播放器,能更好地让你的双通道Hi- ...

  9. 安卓网apk安装器_安卓APP推荐:假日时间规划师,定时音乐播放器,最小的APK提取器...

    今天小趣同学给大家推荐3款非常精美实用的安卓APP,都是小编精心挑选出来的应用,喜欢的同学可以试试: Sectograph-假日里的时间规划师 Sectograph 是一款非常精美实用的时间规划应用, ...

最新文章

  1. 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)
  2. Log Cauchy分布的一个Hierarchical模型:LC=Gamma+Gamma+Unif
  3. BIO bi_sector submit_bio make_request_fn
  4. 去哪儿网产品经理的专属心得:产品经理的核心价值
  5. 【caffe】基本数据结构blob
  6. CoreAnimation编程指南(四)图层树结构
  7. sql unicode转中文_SELECT语句《SQL必知必会》
  8. Bad version number in .class file问题解决
  9. 添加映射的过程(2) - 解析
  10. 二元函数求导公式_基本函数求导公式
  11. Python爬虫项目分享一:《爬取周杰伦的歌曲清单》
  12. 自动动手打造绿色的Photoshop CS2
  13. 记录一次Visual Studio运行webservice调用中控打卡机出现的问题
  14. IDEA中对Git的常规操作(合并,提交,新建分支,更新)
  15. linux中如何为文件或文件夹授权?
  16. python 爬取淘宝模特信息
  17. 2020年Java框架排行榜,谁居榜首?
  18. 刘轩-心理学-十点课-如何克服拖延症
  19. Java15th 我在王道的日子(回忆贴)
  20. linux安装 宋体

热门文章

  1. C语言之数据结构基本概览(四十六)
  2. 查找数组中重复数字 (二)
  3. Android lsof查看已打开文件
  4. C++多态虚函数/纯虚函数demo
  5. Java可变参数demo
  6. typescript之nodejs开发
  7. 怎么在html中加横条,如何在HTML中插入一行?html横线标签hr全新讲解
  8. mysql search yum_mysql的yum安装与配置
  9. python程序中结束while循环的两种方法是_Python中while循环
  10. python内置模块在哪个文件夹_用 Python 内置模块处理 ini 配置文件