exponenta event banner

Запись обратных вызовов для приложений, созданных программно

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

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

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

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

Укажите значение свойства обратного вызова одним из следующих способов:

Задание дескриптора функции

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

Чтобы создать дескриптор функции, укажите @ перед именем функции. Например, это uicontrol команда задает Callback свойство должно быть дескриптором функции pushbutton_callback:

b = uicontrol('Style','pushbutton','Callback',@pushbutton_callback);

Вот определение функции для pushbutton_callback:

function pushbutton_callback(src,event)
   display('Button pressed');
end
Обратите внимание, что дескриптор функции явно не ссылается ни на какие входные аргументы, но объявление функции включает два входных аргумента. Эти два входных аргумента необходимы для всех обратных вызовов, указанных в качестве дескриптора функции. MATLAB автоматически передает эти аргументы при выполнении обратного вызова. Первым аргументом является компонент пользовательского интерфейса, инициировавший обратный вызов. Второй аргумент предоставляет данные события функции обратного вызова. Если функция обратного вызова не имеет данных о событии, MATLAB передает второй входной аргумент в виде пустого массива. В следующей таблице перечислены обратные вызовы и компоненты, использующие данные событий.

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

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

Задание массива ячеек

Используйте массив ячеек, чтобы указать функцию обратного вызова, которая принимает дополнительные входные аргументы, которые вы хотите использовать в функции. Первый элемент в массиве ячеек является дескриптором функции. Другими элементами в массиве ячеек являются дополнительные входные аргументы, которые необходимо использовать, разделенные запятыми. Указанная функция должна определять те же два входных аргумента, как описано в разделе Указание дескриптора функции. Однако можно определить дополнительные входные данные в объявлении функции после первых двух аргументов.

Это uicontrol создает кнопку и задает Callback является массивом ячеек. В этом случае именем функции является pushbutton_callback, и значение дополнительного входного аргумента равно 5.

b = uicontrol('Style','pushbutton','Callback',{@pushbutton_callback,5});

Вот определение функции для pushbutton_callback:

function pushbutton_callback(src,event,x)
   display(x);
end

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

Укажите анонимную функцию

Укажите анонимную функцию, если требуется, чтобы компонент пользовательского интерфейса выполнял функцию, которая не поддерживает два аргумента, необходимые для дескрипторов функций и массивов ячеек. Например, это uicontrol создает кнопку и задает Callback является анонимной функцией. В этом случае именем функции является myfun, и его объявление функции определяет только один входной аргумент, x.

b = uicontrol('Style','pushbutton','Callback',@(src,event)myfun(x));

Укажите вектор символов, содержащий команды MATLAB (не рекомендуется)

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

hb = uicontrol('Style','pushbutton',...
               'String','Plot line',...
               'Callback','plot(rand(20,3))');
Вектор символов, 'plot(rand(20,3))', является допустимой командой, и MATLAB оценивает ее, когда пользователь нажимает кнопку. Если символьный вектор включает переменную, например,
'plot(x)'
Переменная x должен существовать в базовой рабочей области, когда пользователь инициирует обратный вызов или возвращает ошибку. Переменная не должна существовать во время назначения значения свойства обратного вызова, но она должна существовать, когда пользователь запускает обратный вызов.

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

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