exponenta event banner

Обратные вызовы записи в GUIDE

Примечание

Среда GUIDE будет удалена в следующей версии. После удаления GUIDE существующие приложения GUIDE будут продолжать работать в MATLAB ®, но они не будут редактироваться в GUIDE.

Чтобы продолжить редактирование существующего приложения GUIDE, см. раздел Стратегии миграции GUIDE для получения информации о том, как поддерживать совместимость приложения с будущими выпусками MATLAB. Чтобы создать новые приложения в интерактивном режиме, разработайте приложения с помощью App Designer.

Обратные вызовы для различных действий пользователя

Пользовательский интерфейс и графические компоненты имеют определенные свойства, которые можно связать с определенными функциями обратного вызова. Каждое из этих свойств соответствует определенному действию пользователя. Например, uiccontrol имеет свойство, называемое Callback. Можно задать значение этого свойства как дескриптор функции обратного вызова, анонимной функции или символьного вектора, содержащего выражение MATLAB. Установка этого свойства заставляет приложение отвечать, когда пользователь взаимодействует с uiccontrol. Если Callback свойство не имеет указанного значения, то при взаимодействии пользователя с uiccontrol ничего не происходит.

В этой таблице перечислены доступные свойства обратного вызова, действия пользователя, запускающие функцию обратного вызова, и наиболее распространенные компоненты пользовательского интерфейса и графики, которые их используют.

Свойство обратного вызова

Действие пользователя

Компоненты, использующие это свойство

ButtonDownFcn

Конечный пользователь нажимает кнопку мыши, пока указатель находится на компоненте или рисунке.

axes, figure, uibuttongroup, uicontrol, uipanel, uitable,

Callback

Конечный пользователь запускает компонент. Например, выбор пункта меню, перемещение ползунка или нажатие кнопки.

uicontextmenu, uicontrol, uimenu

CellEditCallback

Конечный пользователь редактирует значение в таблице, ячейки которой можно редактировать.

uitable

CellSelectionCallback

Конечный пользователь выбирает ячейки в таблице.

uitable

ClickedCallback

Пользователь нажимает или переключает инструмент левой кнопкой мыши.

uitoggletool, uipushtool

CloseRequestFcn

Фигура закрывается.

figure

CreateFcn

Обратный вызов выполняется, когда MATLAB создает объект, но до его отображения.

axes, figure, uibuttongroup, uicontextmenu, uicontrol, uimenu, uipushtool, uipanel, uitable, uitoggletool, uitoolbar

DeleteFcn

Обратный вызов выполняется непосредственно перед тем, как MATLAB удалит рисунок.

axes, figure, uibuttongroup, uicontextmenu, uicontrol, uimenu, uipushtool, uipanel, uitable, uitoggletool, uitoolbar

KeyPressFcn

Конечный пользователь нажимает клавишу клавиатуры, пока указатель находится на объекте.

figure, uicontrol, uipanel, uipushtool, uitable, uitoolbar

KeyReleaseFcn

Конечный пользователь отпускает клавишу клавиатуры, пока указатель находится на объекте.

figure, uicontrol, uitable

OffCallback

Выполняется, когда State инструмента переключения изменяется на 'off'.

uitoggletool

OnCallback

Выполняется, когда State инструмента переключения изменяется на 'on'.

uitoggletool

SizeChangedFcn

Конечный пользователь изменяет размер группы кнопок, фигуры или панели, Resize свойство - 'on'.

figure, uipanel, uibuttongroup

SelectionChangedFcn

Конечный пользователь выбирает другой переключатель или переключатель в группе кнопок.

uibuttongroup

WindowButtonDownFcn

Конечный пользователь нажимает кнопку мыши, пока указатель находится в окне рисунка.

figure

WindowButtonMotionFcn

Конечный пользователь перемещает указатель в окне рисунка.

figure

WindowButtonUpFcn

Конечный пользователь отпускает кнопку мыши.

figure

WindowKeyPressFcn

Конечный пользователь нажимает клавишу, пока указатель находится на рисунке или любом из его дочерних объектов.

figure

WindowKeyReleaseFcn

Конечный пользователь отпускает клавишу, пока указатель находится на рисунке или любом из его дочерних объектов.

figure

WindowScrollWheelFcn

Конечный пользователь поворачивает колесо мыши, пока указатель находится на рисунке.

figure

GUIDE - сгенерированные функции обратного вызова и значения свойств

Как GUIDE управляет функциями и свойствами обратного вызова

После добавления uicontrol, uimenu, или uicontextmenu компонент в пользовательский интерфейс пользователя, но перед его сохранением GUIDE заполняет Callback свойство со значением, %automatic. Это значение указывает, что GUIDE генерирует имя для функции обратного вызова.

При сохранении пользовательского интерфейса GUIDE добавляет в файл кода пустое определение функции обратного вызова и устанавливает параметры элемента управления Callback является анонимной функцией. Это определение функции является примером создаваемой GUIDE функции обратного вызова для кнопки.

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)

end
Если сохранить этот пользовательский интерфейс с именем, myui, то GUIDE устанавливает кнопку Callback для следующего значения:
@(hObject,eventdata)myui('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
Это анонимная функция, которая служит ссылкой на функцию, pushbutton1_Callback. Эта анонимная функция имеет четыре входных аргумента. Первым аргументом является имя функции обратного вызова. Последние три аргумента предоставляются MATLAB и рассматриваются в разделе «Синтаксис обратного вызова GUIDE».

Примечание

GUIDE не создает функции обратного вызова автоматически для других компонентов пользовательского интерфейса, таких как таблицы, панели или группы кнопок. Если требуется, чтобы любой из этих компонентов выполнял функцию обратного вызова, необходимо создать обратный вызов, щелкнув правой кнопкой мыши компонент в макете и выбрав элемент в контекстном меню «Просмотр обратных вызовов».

Синтаксис обратного вызова GUIDE

Все обратные вызовы должны принимать по крайней мере три входных аргумента:

  • hObject - компонент пользовательского интерфейса, инициировавший обратный вызов.

  • eventdata - переменная, содержащая подробную информацию об определенных действиях мыши или клавиатуры.

  • handles - A struct содержит все объекты пользовательского интерфейса. GUIDE использует guidata функция для хранения и ведения этой структуры.

Чтобы функция обратного вызова могла принимать дополнительные аргументы, необходимо поместить дополнительные аргументы в конец списка аргументов в определении функции.

Аргумент eventdata

eventdata аргумент предоставляет подробную информацию для определенных функций обратного вызова. Например, если конечный пользователь запускает KeyPressFcnзатем MATLAB предоставляет информацию относительно определенной клавиши (или комбинации клавиш), которую нажал конечный пользователь. Если eventdata недоступна для функции обратного вызова, то MATLAB передает ее как пустой массив. В следующей таблице перечислены обратные вызовы и используемые компоненты. eventdata.

Имя свойства обратного вызоваКомпонент
WindowKeyPressFcn
WindowKeyReleaseFcn
WindowScrollWheel
figure
KeyPressFcnfigure, uicontrol, uitable
KeyReleaseFcnfigure, uicontrol, uitable
SelectionChangedFcnuibuttongroup
CellEditCallback
CellSelectionCallback
uitable

Обмен данными между обратными вызовами GUIDE

Чтобы создать взаимозависимые элементы управления, меню и графические объекты в приложении, необходимо явно предоставить общий доступ к данным тем частям приложения, которым необходим доступ к компоненту.

МетодОписаниеТребования и компромиссы
Общий доступ к данным пользователя

Получение или установка значений свойств непосредственно через объект компонента.

Все компоненты пользовательского интерфейса имеют UserData свойство, которое может хранить любые данные MATLAB.

  • Требуется доступ к компоненту для установки или извлечения свойств.

  • UserData содержит только одну переменную за раз, но можно сохранить несколько значений как struct массив или массив ячеек.

Совместное использование данных приложений

Связывание данных с определенным компонентом с помощью setappdata функция. Вы можете получить доступ к нему позже с помощью getappdata функция.

  • Требуется доступ к компоненту для установки или извлечения данных приложения.

  • Может совместно использовать несколько переменных.

Использовать guidata

Совместное использование данных в окне рисунка с помощью guidata функция.

  • Сохраняет или извлекает данные через любой компонент пользовательского интерфейса.

  • Сохраняет только одну переменную за один раз, но можно сохранять несколько значений как struct массив или массив ячеек.

Общий доступ к данным пользователя в приложениях GUIDE

Компоненты пользовательского интерфейса содержат полезную информацию в свойствах. Например, можно найти текущее положение ползунка, запросив его Value собственность. Кроме того, все компоненты имеют UserData , которое может хранить любую переменную MATLAB. Все функции обратного вызова могут получить доступ к значению, сохраненному в UserData до тех пор, пока эти функции имеют доступ к компоненту.

Как настроить приложение GUIDE для совместного использования данных ползунка с UserData выполните следующие действия:

  1. В окне команд введите guide для открытия нового пустого графического интерфейса.

  2. Отображение имен компонентов пользовательского интерфейса на палитре компонентов:

    1. Выберите меню «Файл» > «Установки» > «РУКОВОДСТВО».

    2. Выберите «Показать имена в палитре компонентов».

    3. Нажмите кнопку ОК.

  3. Выберите кнопочный инструмент из палитры компонентов в левой части редактора макетов и перетащите его в область макета.

  4. Выберите инструмент-ползунок из палитры компонентов в левой части редактора компоновки и перетащите его в область компоновки.

  5. Выберите «Файл» > «Сохранить». Сохранить пользовательский интерфейс как myslider.fig. MATLAB открывает файл кода в редакторе.

  6. Установка начального значения 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 свойства ползунка.

  7. Добавьте код к обратному вызову ползунка для изменения данных. Добавьте эти команды в конец функции, 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 свойства ползунка.

  8. Добавьте код к ответному вызову кнопки для получения данных. Добавьте эти команды в конец функции, 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]);

    Этот код использует структуру дескрипторов для доступа к ползунку. Команда, data = get(handles.slider1,'UserData'), получает ползунок UserData собственность. Затем, display функция отображает сохраненные значения.

  9. Сохраните код, нажав кнопку «Сохранить» на панели инструментов редактора.

Совместное использование данных приложений в приложениях GUIDE

Чтобы сохранить данные приложения, вызовите setappdata функция:

setappdata(obj,name,value);
Первый вход, obj, - объект-компонент, в котором должны храниться данные. Второй вход, name, - понятное имя, описывающее значение. Третий вход, value, - значение, которое требуется сохранить.

Для получения данных приложения используйте getappdata функция:

data = getappdata(obj,name);
Компонент, obj, должен быть объектом компонента, содержащим данные. Второй вход, name, должно соответствовать имени, использованному для хранения данных. В отличие от UserData свойство, которое содержит только одну переменную, можно использовать setappdata для хранения нескольких переменных.

Чтобы настроить приложение GUIDE для общего доступа к данным приложения, выполните следующие действия.

  1. В окне команд введите guide для открытия нового пустого графического интерфейса.

  2. Отображение имен компонентов пользовательского интерфейса на палитре компонентов:

    1. Выберите меню «Файл» > «Установки» > «РУКОВОДСТВО».

    2. Выберите «Показать имена в палитре компонентов».

    3. Нажмите кнопку ОК.

  3. Выберите кнопочный инструмент из палитры компонентов в левой части редактора макетов и перетащите его в область макета.

  4. Выберите инструмент-ползунок из палитры компонентов в левой части редактора компоновки и перетащите его в область компоновки.

  5. Выберите «Файл» > «Сохранить». Сохранить пользовательский интерфейс как myslider.fig. MATLAB открывает файл кода в редакторе.

  6. Установите начальное значение данных приложения в функции открытия, 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 может использовать этот объект фигуры для хранения данных.

  7. Добавьте код для обратного вызова ползунка для изменения данных. Добавьте эти команды в конец функции, 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.

  8. Добавьте код к ответному вызову кнопки для получения данных. Добавьте эти команды в конец функции, 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.

  9. Сохраните код, нажав кнопку «Сохранить» на панели инструментов редактора.

Использовать guidata хранение и совместное использование данных в приложениях GUIDE

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 

ПРИМЕР РУКОВОДСТВА: Совместное использование данных ползунка с помощью guidata

Вот предварительно созданное приложение 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.

Переименование и удаление обратных вызовов, созданных GUIDE

Переименование обратных вызовов

GUIDE создает имя функции обратного вызова путем объединения компонентов Tag и имя свойства обратного вызова. При изменении компонентов Tag значение, затем GUIDE изменяет имя обратного вызова при следующем сохранении пользовательского интерфейса.

Если вы решите изменить Tag значение после сохранения пользовательского интерфейса, затем GUIDE обновляет следующие элементы (при условии, что все компоненты имеют уникальные Tag значения).

  • Определение функции обратного вызова компонента

  • Значение свойства обратного вызова компонента

  • Ссылки в кодовом файле на соответствующее поле в handles структура

Переименование функции обратного вызова без изменения компонентов Tag свойство:

  1. Измените имя в определении функции обратного вызова.

  2. Обновите свойство обратного вызова компонента, изменив первый аргумент, переданный анонимной функции. Например, исходное свойство обратного вызова для кнопки может выглядеть следующим образом:

    @(hObject,eventdata)myui('pushbutton1_Callback',...
                               hObject,eventdata,guidata(hObject))

    В этом примере необходимо изменить: 'pushbutton1_Callback' к новому имени функции.

  3. Измените все другие ссылки на старое имя функции на новое имя функции в кодовом файле.

Удаление обратных вызовов

Функцию обратного вызова можно удалить, если требуется удалить или изменить функцию, выполняемую при выполнении конечным пользователем определенного действия. Для удаления функции обратного вызова:

  1. Выполните поиск и замените все экземпляры, которые ссылаются на функцию обратного вызова в коде.

  2. Откройте пользовательский интерфейс в GUIDE и замените все экземпляры, которые ссылаются на функцию обратного вызова в инспекторе свойств.

  3. Удалите функцию обратного вызова.

Связанные темы