如何在Matlab中使用GUI做一個簡易音樂播放器? ---- (六)控制項間的數據傳遞

我糾結了兩個星期是否要寫這一章…最後決定還是要寫一章收尾,來解釋其中的控制項間的數據傳遞問題。

在前五篇中,如果有童鞋跟上了我的思路或者做完了這樣一個gui,會發現還有一個一直避開的遺留問題,就是將歌曲信息從播放鍵里讀取後再在諸如volumeSlider(操控音量的滑動條)或Axes(展示波形)中使用這些歌曲信息時,使用GUIDE時,在很多時候數據是不能直接跨控制項使用的;即會有控制項間的數據傳遞問題。這這篇文章中我將介紹我主要用到的幾種方法。

那麼,

控制項間的數據傳遞有哪些方法呢?

首先是最為簡單粗暴通用第一種,使用global函數,直接把多個控制項要使用的變數做成全局變數;即在要使用這個變數的控制項的回調函數的開頭都寫上『global+空格+變數名』這個形式的代碼,這個變數就完成了多個控制項間的數據傳遞。我個人在這個項目中就將播放器主體audioplayer做成了全局變數。

  • 優點:大概是看起來很方便,加上很方便編寫吧(小項目中)
  • 缺點:用專業的話來說,就是「破壞了程序的封裝性」;這種方法中變數的改變牽一髮而動全身,小項目倒無所謂,大項目很容易弄出奇怪的bug...

接下來,我們就要根據所適合的不同情景而介紹不同的方法了;

首先當然是簡單的情景;即我們做的gui只有一個figure時(關於figure的問題見下圖:

一條簡單的關係

  • 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文件本身的參數

參考:

參考的一篇文章


推薦閱讀:

TAG:MATLAB | GUI設計 | 音樂播放器(軟體) |