在使用者介面周圍傳遞資料

大多數高階使用者介面要求使用者能夠在構成使用者介面的各種功能之間傳遞資訊。MATLAB 有許多不同的方法可以做到這一點。

guidata

MATLAB 自己的 GUI 開發環境(GUIDE) 更喜歡使用名為 handlesstruct 在回撥之間傳遞資料。此 struct 包含各種 UI 元件的所有圖形控制代碼以及使用者指定的資料。如果你沒有使用自動傳遞 handles 的 GUIDE 建立的回撥,你可以使用 guidata 檢索當前值

% hObject is a graphics handle to any UI component in your GUI
handles = guidata(hObject);

如果要修改儲存在此資料結構中的值,則可以進行修改,但必須將其儲存在 hObject 中,以便其他回撥可以看到更改。你可以通過為 guidata 指定第二個輸入引數來儲存它。

% Update the value
handles.myValue = 2;

% Save changes
guidata(hObject, handles)

hObject 的值無關緊要,只要它是同一個 figure的 UI 元件*,*因為最終資料儲存在包含 hObject 的圖中。

最適合:

  • 儲存 handles 結構,你可以在其中儲存 GUI 元件的所有控制代碼。
  • 儲存大多數回撥需要訪問的其他變數。

不推薦用於

  • 儲存不必由所有回撥和子功能訪問的大變數(對於這些使用 setappdata / getappdata)。

setappdata / getappdata

guidata 方法類似,你可以使用 setappdatagetappdata 來儲存和檢索圖形控制代碼中的值。使用這些方法的優點是,你只能檢索所需的值,而不是包含所有儲存資料的整個 struct 。它類似於鍵/值儲存。

在圖形物件中儲存資料

% Create some data you would like to store
myvalue = 2

% Store it using the key 'mykey'
setappdata(hObject, 'mykey', myvalue)

並從不同的回撥中檢索相同的值

value = getappdata(hObject, 'mykey');

注意: 如果在呼叫 getappdata 之前沒有儲存任何值,它將返回一個空陣列([])。

guidata 類似,資料儲存在包含 hObject 的圖中。

最適合:

  • 儲存不必由所有回撥和子函式訪問的大變數。

UserData

每個圖形控制代碼都有一個特殊的屬性 UserData,它可以包含你想要的任何資料。它可能包含一個單元陣列,一個 struct,甚至一個標量。你可以利用此屬性並在此欄位中儲存你希望與給定圖形控制代碼關聯的所有資料。如果你使用的是 R2014b 或更新版本,則可以使用標準 get / set 方法儲存和檢索圖形物件或點符號。

% Create some data to store
mydata = {1, 2, 3};

% Store it within the UserData property
set(hObject, 'UserData', mydata)

% Of if you're using R2014b or newer:
% hObject.UserData = mydata;

然後從另一個回撥中,你可以檢索此資料:

their_data = get(hObject, 'UserData');

% Or if you're using R2014b or newer:
% their_data = hObject.UserData;

最適合:

  • 儲存具有有限範圍的變數(可能僅由儲存它們的物件使用的變數,或與其具有直接關係的物件)。

巢狀函式

在 MATLAB 中,巢狀函式可以讀取和修改父函式中定義的任何變數。這樣,如果將回撥指定為巢狀函式,它可以檢索和修改主函式中儲存的任何資料。

function mygui()    
    hButton = uicontrol('String', 'Click Me', 'Callback', @callback);

    % Create a counter to keep track of the number of times the button is clicked
    nClicks = 0;

    % Callback function is nested and can therefore read and modify nClicks
    function callback(source, event)
        % Increment the number of clicks
        nClicks = nClicks + 1;

        % Print the number of clicks so far
        fprintf('Number of clicks: %d\n', nClicks);
    end
end

最適合:

  • 小而簡單的 GUI。 (為了快速原型設計,不必實現 guidata 和/或 set/getappdata 方法)。

不推薦用於

  • 中型,大型或複雜的 GUI。

  • 使用 GUIDE 建立的 GUI。

顯式輸入引數

如果需要將資料傳送到回撥函式而不需要修改回撥中的資料,則始終可以考慮使用精心設計的回撥定義將資料傳遞給回撥。

你可以使用新增輸入的匿名函式

% Create some data to send to mycallback
data = [1, 2, 3];

% Pass data as a third input to mycallback
set(hObject, 'Callback', @(source, event)mycallback(source, event, data))

或者你可以使用單元格陣列語法指定回撥,再次指定其他輸入。

set(hObject, 'Callback', {@mycallback, data})

最適合:

  • 當回撥需要 data 執行某些操作但是 data 變數不需要修改並儲存在新狀態中。