Много приложений содержат взаимозависимые средства управления, меню и графические объекты. Поскольку каждая функция обратного вызова имеет свой собственный осциллограф, необходимо явным образом осуществлять обмен данными с теми частями приложения, которое должно получить доступ к ней. Приведенная ниже таблица описывает несколько различных методов для обмена данными в рамках вашего приложения.
Метод | Описание | Требования и компромиссы |
---|---|---|
Храните данные в UserData или других свойствах объектов | Получите или установите значения свойств непосредственно через объект компонента. Все компоненты пользовательского интерфейса имеют |
|
Храните данные как данные приложения | Объединенные данные с определенным компонентом с помощью |
|
Создание вложенных функций обратного вызова (программные приложения) | Вложите свои функции обратного вызова в вашей основной функции. Это предоставляет ваш доступ к функциям обратного вызова ко всем переменным в основной функции. |
|
Хранение Данных Используя Функцию guidata | Осуществляйте обмен данными с окном рисунка с помощью |
|
Компоненты пользовательского интерфейса содержат полезную информацию в своих свойствах. Например, можно найти текущее положение ползунка путем запроса его Value
свойство. Кроме того, все компоненты имеют UserData
свойство, которое может сохранить любую переменную MATLAB. Все функции обратного вызова могут получить доступ к значению, сохраненному в UserData
свойство пока те функции может получить доступ к компоненту.
Используйте запись через точку, component.propertyname
, получить или установить значения свойств программно. Запись через точку работает в R2014b и более поздних релизах. Этот код получает и определяет имя фигуры.
hfig = figure; figname = hfig.Name; hfig.Name = 'My Window';
get
и set
функции вместо этого:hfig = figure; figname = get(hfig,'Name'); set(hfig,'Name','My Window');
Если ваш код не имеет прямого доступа к компоненту, используйте findobj
функционируйте, чтобы искать тот компонент. Если поиск успешен, findobj
возвращает компонент, как выведено. Затем можно получить доступ к свойствам компонента.
Следующий код приложения использует UserData
свойство поделиться информацией о ползунке. Чтобы видеть, как это работает, скопируйте и вставьте этот код в редактор и запустите его.
function my_slider() hfig = figure(); slider = uicontrol('Parent', hfig,'Style','slider',... 'Units','normalized',... 'Position',[0.3 0.5 0.4 0.1],... 'Tag','slider1',... 'UserData',struct('val',0,'diffMax',1),... 'Callback',@slider_callback); button = uicontrol('Parent', hfig,'Style','pushbutton',... 'Units','normalized',... 'Position',[0.4 0.3 0.2 0.1],... 'String','Display Difference',... 'Callback',@button_callback); end function slider_callback(hObject,eventdata) sval = hObject.Value; diffMax = hObject.Max - sval; data = struct('val',sval,'diffMax',diffMax); hObject.UserData = data; % For R2014a and earlier: % sval = get(hObject,'Value'); % maxval = get(hObject,'Max'); % diffMax = maxval - sval; % data = struct('val',sval,'diffMax',diffMax); % set(hObject,'UserData',data); end function button_callback(hObject,eventdata) h = findobj('Tag','slider1'); data = h.UserData; % For R2014a and earlier: % data = get(h,'UserData'); display([data.val data.diffMax]); end
slider_callback
использование эти команды, чтобы хранить данные в структуре:
data = struct('val',sval,'diffMax',diffMax)
хранит значения, sval
и diffMax
, в структуре под названием data
.
hObject.UserData = data
хранит значение data
в UserData
свойство ползунка.
Когда пользователь кликает по кнопке, button_callback
использование эти команды, чтобы получить данные:
h = findobj('Tag','slider1')
находит компонент ползунка.
data = h.UserData
получает значение UserData
ползунка свойство.
Среда GUIDE будет удалена в будущем релизе. После того, как GUIDE удален, существующие приложения GUIDE продолжат запускаться в MATLAB, но они не будут доступны для редактирования в GUIDE.
Чтобы продолжить редактировать существующее приложение GUIDE, см. Стратегии Миграции GUIDE информации о том, как помочь обеспечить совместимость приложения с будущими релизами MATLAB. Чтобы создать новые приложения, используйте App Designer вместо этого.
Настраивать приложение GUIDE для совместного использования данных о ползунке с UserData
свойство, выполните эти шаги:
В Командном окне введите guide
.
В диалоговом окне GUIDE Quick Start выберите Blank GUI (Default). Затем нажмите OK.
Отобразите имена компонентов пользовательского интерфейса в палитре элементов:
Выберите File> Preferences> GUIDE.
Выберите Show names in component palette.
Нажмите OK.
Выберите инструмент кнопки из палитры элементов в левой стороне Редактора макетов и перетащите его в область размещения.
Выберите инструмент ползунка из палитры элементов в левой стороне Редактора макетов и перетащите его в область размещения.
Выберите File> Save. Сохраните пользовательский интерфейс как myslider.fig
. MATLAB открывает файл кода в Редакторе.
Установите начальное значение UserData
свойство во вводной функции, myslider_OpeningFcn
. Эта функция выполняется непосредственно перед тем, как пользовательский интерфейс отображается пользователям.
В myslider_OpeningFcn
, вставьте эти команды сразу после команды, handles.output = hObject
.
data = struct('val',0,'diffMax',1); set(handles.slider1,'UserData',data);
myslider_OpeningFcn
выглядит так. function myslider_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to junk (see VARARGIN) % Choose default command line output for myslider handles.output = hObject; data = struct('val',0,'diffMax',1); set(handles.slider1,'UserData',data); % Update handles structure guidata(hObject, handles); % UIWAIT makes myslider wait for user response % uiwait(handles.figure1);
handles
входной параметр к myslider_OpeningFcn
. handles
переменная является структурой, которая содержит все компоненты в пользовательском интерфейсе. Каждое поле в этой структуре соответствует отдельному компоненту. Каждое имя поля совпадает с Tag
свойство соответствующего компонента. Таким образом, handles.slider1
компонент ползунка в этом пользовательском интерфейсе. Команда, set(handles.slider1,'UserData',data)
хранит переменную, data
, в UserData
свойство ползунка.Добавьте код в коллбэк ползунка для изменения данных. Добавьте эти команды в конец функции, slider1_Callback
.
maxval = get(hObject,'Max'); sval = get(hObject,'Value'); diffMax = maxval - sval; data = get(hObject,'UserData'); data.val = sval; data.diffMax = diffMax; % Store data in UserData of slider set(hObject,'UserData',data);
slider1_Callback
выглядит так.% --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider maxval = get(hObject,'Max'); sval = get(hObject,'Value'); diffMax = maxval - sval; data = get(hObject,'UserData'); data.val = sval; data.diffMax = diffMax; % Store data in UserData of slider set(hObject,'UserData',data);
hObject
входной параметр к slider1_Callback
функция. hObject
всегда компонент, который инициировал коллбэк (ползунок, в этом случае). Таким образом, set(hObject,'UserData',data)
, хранит data
переменная в UserData
свойство ползунка.Добавьте код в коллбэк кнопки для того, чтобы получить данные. Добавьте эти команды в конец функции, pushbutton1_Callback
.
% Get UserData from the slider data = get(handles.slider1,'UserData'); currentval = data.val; diffval = data.diffMax; display([currentval diffval]);
pushbutton1_Callback
выглядит так.% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get UserData from the slider data = get(handles.slider1,'UserData'); currentval = data.val; diffval = data.diffMax; display([currentval diffval]);
Этот код использует структуру handles, чтобы получить доступ к ползунку. Команда, data = get(handles.slider1,'UserData')
, получает UserData
ползунка свойство. Затем
display
функционируйте отображает сохраненные значения.
Сохраните свой код путем нажатия Save в редакторе Тулстрипе.
Чтобы сохранить данные приложения, вызовите setappdata
функция:
setappdata(obj,name,value);
obj
, объект компонента, в котором можно хранить данные. Второй вход, name
, дружественное имя, которое описывает значение. Третий вход, value
, значение, которое вы хотите сохранить.Чтобы получить данные приложения, используйте getappdata
функция:
data = getappdata(obj,name);
obj
, должен быть объект компонента, содержащий данные. Второй вход, name
, должен совпадать с именем, вы раньше хранили данные. В отличие от UserData
свойство, которое только содержит только одну переменную, можно использовать setappdata
сохранить несколько переменных.Это приложение использует данные приложения, чтобы совместно использовать два значения. Чтобы видеть, как это работает, скопируйте и вставьте этот код в редактор и запустите его.
function my_slider() hfig = figure(); setappdata(hfig,'slidervalue',0); setappdata(hfig,'difference',1); slider = uicontrol('Parent', hfig,'Style','slider',... 'Units','normalized',... 'Position',[0.3 0.5 0.4 0.1],... 'Tag','slider1',... 'Callback',@slider_callback); button = uicontrol('Parent', hfig,'Style','pushbutton',... 'Units','normalized',... 'Position',[0.4 0.3 0.2 0.1],... 'String','Display Values',... 'Callback',@button_callback); end function slider_callback(hObject,eventdata) diffMax = hObject.Max - hObject.Value; setappdata(hObject.Parent,'slidervalue',hObject.Value); setappdata(hObject.Parent,'difference',diffMax); % For R2014a and earlier: % maxval = get(hObject,'Max'); % currval = get(hObject,'Value'); % diffMax = maxval - currval; % parentfig = get(hObject,'Parent'); % setappdata(parentfig,'slidervalue',currval); % setappdata(parentfig,'difference',diffMax); end function button_callback(hObject,eventdata) currentval = getappdata(hObject.Parent,'slidervalue'); diffval = getappdata(hObject.Parent,'difference'); % For R2014a and earlier: % parentfig = get(hObject,'Parent'); % currentval = getappdata(parentfig,'slidervalue'); % diffval = getappdata(parentfig,'difference'); display([currentval diffval]); end
slider_callback
функция вычисляет diffMax
. Затем это использует эти команды, чтобы изменить данные приложения:
setappdata(hObject.Parent,'slidervalue',hObject.Value)
хранит текущее значение ползунка в фигуре, использующей имя, 'slidervalue'
. В этом случае, hObject.Parent
фигура.
setappdata(parentfig,'difference',diffMax)
хранилища diffMax
в фигуре, использующей имя, 'difference'
.
Когда пользователь кликает по кнопке, button_callback
функция получает данные с помощью этих команд:
currentval = getappdata(hObject.Parent,'slidervalue')
получает текущее значение ползунка от фигуры. В этом случае, hObject.Parent
фигура.
diffval = getappdata(hObject.Parent,'difference')
получите значение различия от фигуры.
Среда GUIDE будет удалена в будущем релизе. После того, как GUIDE удален, существующие приложения GUIDE продолжат запускаться в MATLAB, но они не будут доступны для редактирования в GUIDE.
Чтобы продолжить редактировать существующее приложение GUIDE, см. Стратегии Миграции GUIDE информации о том, как помочь обеспечить совместимость приложения с будущими релизами MATLAB. Чтобы создать новые приложения, используйте App Designer вместо этого.
Чтобы настроить приложение GUIDE для совместного использования данных приложения, выполните эти шаги:
В Командном окне введите guide
.
В диалоговом окне GUIDE Quick Start выберите Blank GUI (Default). Затем нажмите OK.
Отобразите имена компонентов пользовательского интерфейса в палитре элементов:
Выберите File> Preferences> GUIDE.
Выберите Show names in component palette.
Нажмите OK.
Выберите инструмент кнопки из палитры элементов в левой стороне Редактора макетов и перетащите его в область размещения.
Выберите инструмент ползунка из палитры элементов в левой стороне Редактора макетов и перетащите его в область размещения.
Выберите File> Save. Сохраните пользовательский интерфейс как myslider.fig
. MATLAB открывает файл кода в Редакторе.
Установите начальное значение данных приложения во вводной функции, myslider_OpeningFcn
. Эта функция выполняется непосредственно перед тем, как пользовательский интерфейс отображается пользователям. В myslider_OpeningFcn
, вставьте эти команды сразу после команды, handles.output = hObject
.
setappdata(handles.figure1,'slidervalue',0); setappdata(handles.figure1,'difference',1);
myslider_OpeningFcn
выглядит так. function myslider_OpeningFcn(hObject,eventdata,handles,varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to junk (see VARARGIN) % Choose default command line output for junk handles.output = hObject; setappdata(handles.figure1,'slidervalue',0); setappdata(handles.figure1,'difference',1); % Update handles structure guidata(hObject, handles); % UIWAIT makes junk wait for user response (see UIRESUME) % uiwait(handles.figure1);
handles
входной параметр к myslider_OpeningFcn
. handles
переменная является структурой, которая содержит все компоненты в пользовательском интерфейсе. Каждое поле в этой структуре соответствует отдельному компоненту. Каждое имя поля совпадает с Tag
свойство соответствующего компонента. В этом случае, handles.figure1
объект фигуры. Таким образом, setappdata
может использовать объект этого рисунка хранить данные.Добавьте код в коллбэк ползунка для изменения данных. Добавьте эти команды в конец функции, slider1_Callback
.
maxval = get(hObject,'Max'); currval = get(hObject,'Value'); diffMax = maxval - currval; % Store application data setappdata(handles.figure1,'slidervalue',currval); setappdata(handles.figure1,'difference',diffMax);
slider1_Callback
выглядит так.function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider maxval = get(hObject,'Max'); currval = get(hObject,'Value'); diffMax = maxval - currval; % Store application data setappdata(handles.figure1,'slidervalue',currval); setappdata(handles.figure1,'difference',diffMax);
handles
структура, таким образом, setappdata
команды хранят данные в handles.figure1
.Добавьте код в коллбэк кнопки для того, чтобы получить данные. Добавьте эти команды в конец функции, pushbutton1_Callback
.
% Retrieve application data currentval = getappdata(handles.figure1,'slidervalue'); diffval = getappdata(handles.figure1,'difference'); display([currentval diffval]);
pushbutton1_Callback
выглядит так.% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Retrieve application data currentval = getappdata(handles.figure1,'slidervalue'); diffval = getappdata(handles.figure1,'difference'); display([currentval diffval]);
handles
структура, таким образом, getappdata
команды получают данные от handles.figure1
.Сохраните свой код путем нажатия Save в редакторе Тулстрипе.
Можно вложить функции обратного вызова в основной функции программного приложения. Когда вы делаете это, вложенные функции обратного вызова совместно используют рабочую область с основной функцией. В результате вложенные функции имеют доступ ко всем компонентам пользовательского интерфейса и переменным, заданным в основной функции. Следующий пример кода использует вложенные функции, чтобы осуществлять обмен данными о положении ползунка. Чтобы видеть, как это работает, скопируйте и вставьте этот код в редактор и запустите его.
function my_slider() hfig = figure(); data = struct('val',0,'diffMax',1); slider = uicontrol('Parent', hfig,'Style','slider',... 'Units','normalized',... 'Position',[0.3 0.5 0.4 0.1],... 'Tag','slider1',... 'Callback',@slider_callback); button = uicontrol('Parent', hfig,'Style','pushbutton',... 'Units','normalized',... 'Position',[0.4 0.3 0.2 0.1],... 'String','Display Difference',... 'Callback',@button_callback); function slider_callback(hObject,eventdata) sval = hObject.Value; diffMax = hObject.Max - sval; % For R2014a and earlier: % sval = get(hObject,'Value'); % maxval = get(hObject,'Max'); % diffMax = maxval - sval; data.val = sval; data.diffMax = diffMax; end function button_callback(hObject,eventdata) display([data.val data.diffMax]); end end
struct
массив под названием data
. Когда пользователь перемещает ползунок, slider_callback
функционируйте обновляет val
и diffMax
поля data
структура. Когда конечный пользователь кликает по кнопке, button_callback
функционируйте отображает значения, сохраненные в data
.
Вложенные функции не рекомендуются для приложений GUIDE.
guidata
функция обеспечивает способ осуществлять обмен данными с окном рисунка. Можно сохранить или получить данные в любом коллбэке через hObject
компонент. Это означает это, в отличие от работы с UserData
или данные приложения, вам не нужен доступ к одному определенному компоненту, чтобы установить или получить данные. Вызовите guidata
с двумя входными параметрами, чтобы хранить данные:
guidata(object_handle,data);
object_handle
, любой компонент пользовательского интерфейса (обычно hObject
). Второй вход, data
, переменная должна сохранить. Каждый раз вы вызываете guidata
с помощью двух входных параметров MATLAB перезаписывает любые ранее хранимые данные. Это означает, что можно только сохранить одну переменную за один раз. Если вы хотите совместно использовать несколько значений, то храните данные как struct
массив или массив ячеек.Чтобы получить данные, вызовите guidata
использование одного входного параметра и одного выходного аргумента:
data = guidata(object_handle);
Если ваши данные хранятся как struct
массив или массив ячеек, и вы хотите обновить один элемент, не изменяя другие элементы, затем получить данные и заменить его на модифицированный массив:
data = guidata(hObject); data.myvalue = 2; guidata(hObject,data);
Использовать guidata
в программном приложении храните данные с некоторыми начальными значениями в основной функции. Затем можно получить и изменить данные в любой функции обратного вызова.
Следующий код является простым примером программного приложения, которое использует guidata
совместно использовать структуру, содержащую два поля. Чтобы видеть, как это работает, скопируйте и вставьте этот код в редактор и запустите его.
function my_slider() hfig = figure(); guidata(hfig,struct('val',0,'diffMax',1)); slider = uicontrol('Parent', hfig,'Style','slider',... 'Units','normalized',... 'Position',[0.3 0.5 0.4 0.1],... 'Tag','slider1',... 'Callback',@slider_callback); button = uicontrol('Parent', hfig,'Style','pushbutton',... 'Units','normalized',... 'Position',[0.4 0.3 0.2 0.1],... 'String','Display Values',... 'Callback',@button_callback); end function slider_callback(hObject,eventdata) data = guidata(hObject); data.val = hObject.Value; data.diffMax = hObject.Max - data.val; % For R2014a and earlier: % data.val = get(hObject,'Value'); % maxval = get(hObject,'Max'); % data.diffMax = maxval - data.val; guidata(hObject,data); end function button_callback(hObject,eventdata) data = guidata(hObject); display([data.val data.diffMax]); end
slider_callback
функция выполняет эти команды, чтобы получить и изменить хранимые данные:data = guidata(hObject)
получает хранимые данные как структуру.
data.diffMax = maxval - data.val
изменяет diffMax
поле в структуре.
guidata(hObject,data)
хранит модифицированную структуру.
Когда пользователь кликает по кнопке, button_callback
вызовы функции guidata
получать копию сохраненной структуры. Затем это отображает эти два значения, сохраненные в структуре.
Среда GUIDE будет удалена в будущем релизе. После того, как GUIDE удален, существующие приложения GUIDE продолжат запускаться в MATLAB, но они не будут доступны для редактирования в GUIDE.
Чтобы продолжить редактировать существующее приложение GUIDE, см. Стратегии Миграции GUIDE информации о том, как помочь обеспечить совместимость приложения с будущими релизами MATLAB. Чтобы создать новые приложения, используйте App Designer вместо этого.
GUIDE использует guidata
функционируйте, чтобы сохранить структуру под названием handles
, который содержит все компоненты пользовательского интерфейса. MATLAB передает handles
массив к каждой функции обратного вызова. Если вы хотите использовать guidata
чтобы совместно использовать дополнительные данные, затем добавьте поля в handles
структура во вводной функции. Вводная функция является функцией, определяемой около верхней части вашего файла кода, который имеет _OpeningFcn
на имя.
Чтобы изменить ваши данные в функции обратного вызова, измените handles
структура, и затем хранит его с помощью guidata
функция. Эта функция обратного вызова ползунка показывает, как изменить и сохранить handles
структура в функции обратного вызова GUIDE.
function slider1_Callback(hObject, eventdata,handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range handles.myvalue = 2; guidata(hObject,handles); end
Вот предварительно созданное приложение GUIDE, которое использует guidata
функция, чтобы осуществлять обмен данными между ползунком и текстовым полем. Когда вы перемещаете ползунок, номер, отображенный в текстовом поле, изменяется, чтобы показать новое положение ползунка.
Вот предварительно созданное приложение GUIDE, которое использует данные приложения и guidata
функция, чтобы осуществлять обмен данными между двумя диалоговыми окнами. При вводе текст во втором диалоговом окне и нажимаете ОК, изменения названия кнопки в первом диалоговом окне.
В changeme_main.m
, buttonChangeMe_Callback
функция выполняет эту команду, чтобы отобразить второе диалоговое окно:
changeme_dialog('changeme_main', handles.figure)
handles.figure
входным параметром является Figure
объект для changeme_main диалогового окна.
changeme_dialog
функция получает handles
структура от Figure
объект. Таким образом целый набор компонентов в changeme_main диалоговом окне доступен для второго диалогового окна.
Вот предварительно созданное приложение GUIDE, которое использует guidata
и UserData
осуществлять обмен данными среди трех окон приложения. Большое окно является редактором иконок, который принимает информацию из окон палитры инструментов и цветовой палитры.
В guide_inconeditor.m
, функциональный guide_iconeditor_OpeningFcn
содержит эту команду:
colorPalette = guide_colorpalette('iconEditor', hObject)
Аргументы:
'iconEditor'
указывает, что коллбэк в guide_iconEditor окне инициировал выполнение функции.
hObject
Figure
объект для guide_iconEditor окна.
colorPalette
Figure
объект для guide_colorPalette окна.
Точно так же guide_iconeditor_OpeningFcn
вызывает guide_toolpalette
функция с подобными аргументами ввода и вывода.
Передача Figure
объект между этими функциями позволяет guide_iconEditor окну получать доступ к handles
структура других двух окон. Аналогично, другие два окна могут получить доступ к handles
структура для guide_iconEditor окна.