控件属性怎么用_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (六)控件间的数据传递...

339082308f088daf479a0795324f3ffa.png

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

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

那么,

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

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

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

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

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

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

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

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

%将数据a存在listbox控件中
a = 1;
set(handles.listbox,'UserData',a);
%然后画面转到另一个控件中
%在另一个地方取出来
a = get(handles.listbox,'UserData');
  • 优点:使用简单!思路理起来也不乱
  • 缺点:每个控件只有一个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文件本身的参数

参考:

参考的一篇文章

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值